[英]Keycloak reauthenticate an Authenticated user with a different client
如果我有一个用户已经使用 keycloak 与 R 域下的公共客户端 C1 进行了身份验证,是否有一个端点可以在 keycloak 中命中,该端点将为同一域 R 下的不同公共客户端 C2 生成一个新的访问令牌?
[更新 #1]我尝试使用刷新令牌为 C2 客户端获取新的访问令牌,但出现以下错误:
Invalid refresh token. Token client and authorized client don't match
[更新 #2]所以,上面给了我尝试使用交换令牌授予类型的想法,我现在可以使用了。
curl --request POST \
'https://myhost.com.au/auth/realms/<my realm>/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'subject_token=<c1 access token>' \
--data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:refresh_token' \
--data-urlencode 'client_id=<c2 client id>'
你的问题是有道理的。 不幸的是,角色范围映射文档对于如何在切换到不同客户端时生成新的访问令牌难以捉摸。
有一个关于令牌交换的Oauth2 RFC 。 从Keycloak 11.0.2 开始,令牌交换被记录为技术预览,并且必须使用-Dkeycloak.profile.feature.token_exchange=enabled
您可以通过这种方式交换代币(实际上取自问题):
Method: POST
URL: https://<keycloak.host>/auth/realms/myrealm/protocol/openid-connect/token
Body type: x-www-form-urlencoded
Form fields:
. grant_type: urn:ietf:params:oauth:grant-type:token-exchange
. suject_token: <C1-access-token>
. subject_token_type: urn:ietf:params:oauth:token-type:access_token
. requested_token_type=urn:ietf:params:oauth:token-type:refresh_token
. client_id: <C2-client-id>
以下是供其他读者使用的“角色范围映射”文档中的一些上下文。
创建 OIDC 访问令牌或 SAML 断言时,默认情况下,用户的所有用户角色映射都作为声明添加到令牌或断言中。 [...] 访问令牌经过数字签名,实际上可以由应用程序重新使用以调用其他远程安全的 REST 服务。 这意味着,如果应用程序遭到入侵或存在向该领域注册的流氓客户端,攻击者可以获得具有广泛权限的访问令牌,并且您的整个网络都会受到威胁。 这就是角色范围映射变得重要的地方。
角色范围映射是一种限制在访问令牌中声明的角色的方法。 当客户端请求对用户进行身份验证时,他们收到的访问令牌将仅包含您为客户端范围明确指定的角色映射。
[...] 要更改此默认行为,您必须明确关闭“允许全范围”开关并在每个客户端中声明您想要的特定角色。 或者,您还可以使用客户端范围为一整套客户端定义相同的角色范围映射。
@otonglet 你有一个小错字,我花了 30 分钟才发现它是错字:) 将 suject_token 更改为 subject_token 。 感谢您的回答,我没有足够的声誉来投票:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.