7.2. 内部令牌到内部令牌交换
使用内部令牌来对特定客户端进行令牌交换,您希望为不同的目标客户端交换这个令牌。您为什么会想进行此操作?当客户端本身有 mint 令牌时,通常会发生这种情况,需要为访问令牌中需要不同的声明和权限的其他应用程序创建额外的请求。如果您需要执行"权限级",且应用程序需要在比较可信应用上调用并且不想传播您当前的访问令牌,则可能需要进行此类交换的其他原因。
7.2.1. 授予对交换的权限
希望为不同客户端交换令牌的客户端需要在管理控制台中授权。您需要在您要交换的目标客户端中定义 token-exchange
fine grain 权限。
目标客户端权限
流程
将启用 的权限 切换到 ON。
目标客户端权限
该页面显示一个 token-exchange 链接。
点击该链接以开始定义权限。
这个设置页面会显示。
目标客户端交换权限设置
- 点 Authorization 链接为这个权限定义策略
- 点 Policies 标签页。
创建 客户端 策略.
客户端策略创建
- 在起始客户端中输入,作为请求令牌交换的经过身份验证的用户。
创建此策略后,返回目标客户端的 token-exchange 权限,再添加您刚刚定义的客户端策略。
应用客户端策略
您的客户端现在有调用的权限。如果您没有正确执行此操作,如果您尝试进行交换,将得到一个 403 Forbidden 响应。
7.2.2. 发出请求
当客户端交换针对其他客户端的令牌的现有令牌时,请使用 audience
参数。此参数必须是您在 Admin 控制台中配置的目标客户端的客户端标识符。
curl -X POST \ -d "client_id=starting-client" \ -d "client_secret=the client secret" \ --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \ -d "subject_token=...." \ --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:refresh_token" \ -d "audience=target-client" \ http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token
subject_token
参数必须是目标域的访问令牌。如果您的 requested_token_type
参数是一个刷新令牌类型,则响应将同时包含访问令牌、刷新令牌和过期。以下是您从这个调用中获取的 JSON 响应示例:
如果没有设置 使用者
参数,则参数的值默认为生成令牌交换请求的客户端。
与机密客户端不同,公共客户端不允许使用来自其他客户端的令牌来执行令牌交换。如果您传递了 subject_token
,发布令牌的 (机密)客户端应与客户端发出请求匹配;如果向其他客户端发布,则发出请求的客户端应当位于使用者上。
如果您明确设置目标 audience
(客户端与发出请求的客户端不同),您应确保为客户端集配置了 token-exchange
范围权限,设置 audience
权限以允许客户端成功完成交换。
{ "access_token" : "....", "refresh_token" : "....", "expires_in" : 3600 }