1

如果我有一个用户在领域 R 下使用公共客户端 C1 使用 keycloak 进行身份验证,是否有一个端点可以在 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>'
4

1 回答 1

1

你的问题很有道理。不幸的是,角色范围映射文档对于如何在切换到不同的客户端时生成新的访问令牌是难以捉摸的。

有一个关于令牌交换的 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
. subject_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 服务。这意味着,如果应用程序受到攻击或在该领域注册了恶意客户端,攻击者可以获得具有广泛权限的访问令牌,并且您的整个网络都会受到威胁。这就是角色范围映射变得重要的地方。

角色范围映射是一种限制在访问令牌中声明的角色的方法。当客户端请求对用户进行身份验证时,他们收到的访问令牌将仅包含您为客户端范围明确指定的角色映射。

[...] 要更改此默认行为,您必须明确关闭 Full Scope Allowed 开关并在每个单独的客户端中声明您想要的特定角色。或者,您也可以使用客户端范围为一整套客户端定义相同的角色范围映射。

于 2020-09-18T07:25:39.660 回答