我使用的是Keycloak 14.0.0,并启用了token_exchange的特性预览,以便进行模拟。在Keycloak中配置我的用户,使其在客户机"领域管理"上承担模拟角色后;(根据[文档][1]),由于令牌无效,进行令牌交换的实际请求失败。
经过一些调试后,发现jwt令牌确实是错误的:
...
"session_state": "a03aeg0e-b5ce-4a50-9038-c339e50338c4",
"acr": "1",
"allowed-origins": [
"http://0.0.0.0:9180"
],
"scope": "openid identity_provider email admin profile company",
"permissions": [
"consented-readonly",
"readonly",
"trackingdisabled"
],
"resource_access": {
".roles": [
"impersonation"
]
},
"email_verified": false,
"idp": "myidp",
...
在上面,请注意"。roles"。我认为这是不正确的。它应该是这样的:
"resource_access": {
"myclient": {
"roles": [
"impersonation"
]
}
如何解决这个问题?[1]: https://www.keycloak.org/docs/latest/securing_apps/index.html扮演
结果是映射器的配置不正确。在本例中是"客户角色"。映射器(客户端范围)->角色→映射器→keycloak ui中的客户端角色,在我的keycloak设置中,其值为:
resource_access..roles
这是不正确的,因为它应该包含一个clientId占位符,如下所示:
resource_access.${client_id}.roles
在此更改之后,accessToken包含实际的客户端,从而在accessToken
中生成有效的json。