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

时间:2017-09-07 13:03:02

标签: node.js express openid keycloak keycloak-services

所以我在使用Keycloak-Connect示例时遇到了一些问题。

基本上我在快速路线上使用Keycloak进行简单的检查在我的VM上

(10.10.10.54:8081)如下。

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

我的Keycloak Server位于单独的VM上(对于此示例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'`  

将令牌解析为变量。

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

仍然不断返回Access Denied,我在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,或者这是一个设置问题?

提前致谢

2 个答案:

答案 0 :(得分:2)

我的问题出现在我的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);
}

帮助我自己追踪这个问题。

答案 1 :(得分:0)

如果您在本地主机上工作并且遇到相同的问题,那么我的问题是我在本地主机中使用https,即realmUrl: "https://localhost:8080/auth/realms/master"而不是realmUrl: "http://localhost:8080/auth/realms/master"