Keycloak - 授予验证失败。原因:令牌无效(错误的 ISS)
Keycloak - Grant validation failed. Reason: invalid token (wrong ISS)
所以我在使用 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`
这个 returns 每次都是正确的访问令牌,
TOKEN=`echo $RESULT | sed 's/.*access_token":"//g' | sed 's/".*//g'`
将令牌解析为变量。
curl http://10.10.10.54:8081/api -H "Authorization: bearer $TOKEN"
仍然不断 returns 访问被拒绝,我在一个类似的例子中用 Keycloak-Quickstart Node Service 尝试了这个,看看是否有更详细的错误。我收到的是
Validate grant failed
Grant validation failed. Reason: invalid token (wrong ISS)
虽然如果我稍等一下,它会给我一个过期令牌错误,所以我觉得我在正确的轨道上。
所以很明显我发出令牌的地方有问题,因为它与预期的地方不匹配?我可以通过 cURL 调用
从 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,或者这是一个设置问题?
提前致谢
我的问题出在我的 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);
}
帮我自己查了这个问题。
如果您在 localhost 中工作并遇到同样的问题,我的问题是我在 localhost 中使用 https,即 realmUrl: "https://localhost:8080/auth/realms/master"
而不是 realmUrl: "http://localhost:8080/auth/realms/master"
我也遇到过同样的问题。我使用以下检查来解决这个问题
1.check你项目中的配置
- 是服务器 url 准确(127.0.0.1 ,本地主机,0.0.0.0 是不同的 urls ..mention
与密钥斗篷相同 url)
- 是小case的境界
- 客户端 ID 和密码正确
如果您仍然遇到问题,请尝试使用单引号而不是双引号
ex-
realm_name:"demo-realm" --> realm_name:'demo-realm'
对我有用
所以我在使用 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`
这个 returns 每次都是正确的访问令牌,
TOKEN=`echo $RESULT | sed 's/.*access_token":"//g' | sed 's/".*//g'`
将令牌解析为变量。
curl http://10.10.10.54:8081/api -H "Authorization: bearer $TOKEN"
仍然不断 returns 访问被拒绝,我在一个类似的例子中用 Keycloak-Quickstart Node Service 尝试了这个,看看是否有更详细的错误。我收到的是
Validate grant failed
Grant validation failed. Reason: invalid token (wrong ISS)
虽然如果我稍等一下,它会给我一个过期令牌错误,所以我觉得我在正确的轨道上。
所以很明显我发出令牌的地方有问题,因为它与预期的地方不匹配?我可以通过 cURL 调用
从 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,或者这是一个设置问题?
提前致谢
我的问题出在我的 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);
}
帮我自己查了这个问题。
如果您在 localhost 中工作并遇到同样的问题,我的问题是我在 localhost 中使用 https,即 realmUrl: "https://localhost:8080/auth/realms/master"
而不是 realmUrl: "http://localhost:8080/auth/realms/master"
我也遇到过同样的问题。我使用以下检查来解决这个问题
1.check你项目中的配置
- 是服务器 url 准确(127.0.0.1 ,本地主机,0.0.0.0 是不同的 urls ..mention 与密钥斗篷相同 url)
- 是小case的境界
- 客户端 ID 和密码正确
如果您仍然遇到问题,请尝试使用单引号而不是双引号 ex-
realm_name:"demo-realm" --> realm_name:'demo-realm'
对我有用