Keycloak - 授权验证失败。原因:无效令牌(错误的 ISS)

Posted

技术标签:

【中文标题】Keycloak - 授权验证失败。原因:无效令牌(错误的 ISS)【英文标题】:Keycloak - Grant validation failed. Reason: invalid token (wrong ISS) 【发布时间】:2018-02-16 05:42:20 【问题描述】:

所以我在让 Keycloak-Connect 示例正常工作时遇到了一些问题。

基本上,我在我的虚拟机上使用 Keycloak 进行了快速路由的简单检查

(10.10.10.54:8081) 如下。

app.get('/api*', keycloak.protect(), (req, res) => res.status(200).send(
    message: 'Hit API Backend!',
));

我的 Keycloak 服务器在一个单独的虚拟机上(对于这个例子 http://keycloak.myexternaldomain.ca/auth/)

我一直在做的测试是。

RESULT=`curl --data "grant_type=password&client_secret=mysecret&client_id=account&username=myusername&password=mypassword" http://keycloak.myexternaldomain.ca/auth/realms/TEST/protocol/openid-connect/token`

这每次都会返回正确的访问令牌,

TOKEN=`echo $RESULT | sed 's/.*access_token":"//g' | sed 's/".*//g'`  

将token解析成变量。

curl http://10.10.10.54:8081/api -H "Authorization: bearer $TOKEN"

仍然不断返回拒绝访问,我在一个类似的例子中尝试了这个,Keycloak-Quickstart Node Service 看看是否有更详细的错误。我收到的是

Validate grant failed
Grant validation failed. Reason: invalid token (wrong ISS)

虽然如果我稍等片刻,它会给我一个 Expired Token 错误,所以我觉得我在正确的轨道上。

所以很明显,我发出令牌的地方与预期的不匹配有什么问题吗?我可以通过 cURLing 调用从 keycloak 服务器本身获取用户凭据

curl --data "grant_type=password&token=$TOKEN&client_secret=secret&client_id=account&username=myaccount&password=mypassword" http://keycloak.myexternaldomain.ca/auth/realms/TEST/protocol/openid-connect/token/introspect

我是否误解了我应该如何使用 Keycloak,或者这是一个设置问题?

提前致谢

【问题讨论】:

【参考方案1】:

我的问题在我的 keycloak.json 中......我的领域与我正在验证的领域不同。

如果您遇到此问题,我建议您修改 keycloak-auth-utils 以在授权管理器上为您提供更详细的错误日志记录。

具体变化

else if (token.content.iss !== this.realmUrl) 
      reject(new Error('invalid token (wrong ISS)'));

else if (token.content.iss !== this.realmUrl) 
      reject(new Error('invalid token (wrong ISS) Expecting: '+this.realmUrl+' Got: '+token.content.iss);

帮我自己找到了这个问题。

【讨论】:

我在这里创建了拉取请求:github.com/keycloak/keycloak-nodejs-auth-utils/pull/80 我遇到了这个问题,这个答案让我遇到了这个问题。我在领域名称中有空格 谢谢你,帮我解决了我的问题,多一个/【参考方案2】:

如果您在 localhost 中工作并遇到同样的问题,我的问题是我在 localhost 中使用 https,即 realmUrl: "https://localhost:8080/auth/realms/master" 而不是 realmUrl: "http://localhost:8080/auth/realms/master"

【讨论】:

【参考方案3】:

我也遇到过同样的问题。我使用以下检查来解决这个问题

1.检查项目中的配置

是 serverurl 精确的(127.0.0.1 , localhost, 0.0.0.0 是不同的 url ..提及 与keycloak url相同) 是小情况下的境界 是客户端 ID,密码正确

如果您仍然遇到问题,请尝试使用单引号而不是双引号 ex-

realm_name:"demo-realm" --> realm_name:'demo-realm'

它对我有用

【讨论】:

以上是关于Keycloak - 授权验证失败。原因:无效令牌(错误的 ISS)的主要内容,如果未能解决你的问题,请参考以下文章

春季无法获取keycloak授权令牌

Keycloak 无效的令牌发行者

验证时 JWT 令牌始终无效

Keycloak 抱怨令牌端点上的 redirect_uri 无效

Spring应用程序基本身份验证通过keycloak

Twitter API - “无效或过期令牌”的原因