我正在尝试通过其 REST API 与 Keycloak 进行交互。我有主领域和默认管理员用户,以及一个测试领域。首先,我获得管理员帐户和测试领域的访问令牌:
let data = {
grant_type : 'password',
client_id : 'test-realm',
username : 'admin',
password : 'admin'
};
let headers = {
'Content-Type': 'application/x-www-form-urlencoded'
};
axios.post(
'https://someurl.com:8080/auth/realms/master/protocol/openid-connect/token',
qs.stringify(data),
headers
)
效果很好。然后我尝试拨打电话来创建用户(或执行其他任何操作),但收到 401 未经授权的错误:
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Bearer ${accessToken}`
};
data = {
rep: {
email: "[email protected]",
username: "[email protected]"
},
path: 'test-realm'
};
axios.post('https://someurl.com:8080/auth/admin/realms/test-realm/users',
qs.stringify(data),
headers
)
这不是包含令牌的正确方法吗?该访问令牌是您用于验证其他 API 调用的访问令牌吗?管理员帐户的令牌不应该用于验证对主领域其他客户端的调用吗?我必须在管理控制台中更改主领域中的某些设置吗?任何帮助表示赞赏。
我收到了 401 错误,因为我使用 http://localhost:8080 生成了离线令牌,然后我尝试使用 http://keycloak:8080 请求 api,这是不允许的。不幸的是日志并没有告诉你这一点。
要调试 JWT 令牌,我建议https://jwt.io/
这不是包含令牌的正确方法吗?
这是正确的做法。
你只是做了一些错误的事情。 请参考
keycloak-request-token
Node.js 模块中的示例:
https://github.com/keycloak/keycloak-request-token/blob/master/index.js#L43
你使用
client_id : 'test-realm'
但是有
client_id: 'admin-cli'
那里。
此外,要创建用户,您应该使用
'Content-Type': 'application/json'
您可以在这里参考 Keycloak REST API 的 Node.js 示例:
https://github.com/v-ladynev/keycloak-nodejs-example/blob/master/lib/adminClient.js
其他有用的东西的例子,例如:
可以在同一个项目中找到:keycloak-nodejs-example
我遇到了这个问题,并通过确保第一个和第二个 API 请求之间的时间不超过 1 分钟来解决它。因此,如果您手动执行此操作(2 个curl 请求),令牌可能会过期,并且您可能会收到错误 401。不过,您应该使用上面提到的 admin-cli。
我最近遇到了这个问题,经过一段时间的挣扎后我发现了。通过 SDK 或 API 交互时,使用包含空格的域名将触发 401 未经授权的错误。
总结: 更改:域名 至:领域名称