12.3. 外部令牌交换的内部令牌
您可以为外部身份提供程序以 mint 的外部令牌交换域令牌。此外部身份提供程序必须在管理控制台的 Identity Provider 部分中配置。目前只支持基于 OAuth/OpenID Connect 的外部身份提供程序,包括所有社交提供程序。红帽构建的 Keycloak 不对外部供应商执行后端通道交换。因此,如果帐户没有链接,您将无法获取外部令牌。要能够获取外部令牌,必须满足这些条件之一:
- 用户必须至少使用外部身份提供程序登录
- 用户必须通过用户帐户服务与外部身份提供程序相关联
- 用户帐户通过外部身份提供程序使用 Client Initiated Account Linking API 链接。
最后,外部身份提供程序必须配置为存储令牌,或者上述一个操作必须使用与您交换的内部令牌相同的用户会话执行。
如果帐户未链接,交换响应将包含您可以用来建立它的链接。在 Making the Request 部分中将对此进行详细讨论。
12.3.1. 为交换授予权限 复制链接链接已复制到粘贴板!
外部令牌交换请求的内部将拒绝 403, Forbidden 响应,直到您向调用客户端授予了与外部身份提供程序交换令牌的权限。要向客户端授予权限,请转至身份提供程序的配置页面,进入 Permissions 选项卡。
图 12.6. 身份提供程序权限
流程
将" 启用" 的权限切换为 On。
图 12.7. 身份提供程序权限
页面中显示 token-exchange 链接。
单击链接以开始定义权限。
此时会出现此设置页面。
图 12.8. 身份提供程序交换权限设置
- 在屏幕顶部的面包屑导航栏中点 Client details。
点 Policies 选项卡创建客户端策略。
图 12.9. 客户端策略创建
- 输入作为请求令牌交换的经过身份验证的用户的起始客户端。
返回到身份提供程序的 token-exchange 权限,并添加您刚才定义的客户端策略。
图 12.10. 应用客户端策略
您的客户端现在有调用的权限。如果不正确这样做,如果您尝试进行交换,您将会收到 403 Forbidden 响应。
12.3.2. 发出请求 复制链接链接已复制到粘贴板!
当客户端将现有内部令牌交换到外部令牌时,您要提供 requested_issuer 参数。参数必须是配置的身份提供程序的别名。
subject_token 参数必须是目标域的访问令牌。requested_token_type 参数必须是 urn:ietf:params:oauth:token-type:access_token 或 left blank。目前不支持其他请求的令牌类型。以下是您从此调用中获取的成功 JSON 响应示例:
{
"access_token" : "....",
"expires_in" : 3600
"account-link-url" : "https://...."
}
{
"access_token" : "....",
"expires_in" : 3600
"account-link-url" : "https://...."
}
如果外部身份提供程序没有出于某种原因链接,您将获得带有此 JSON 文档的 HTTP 400 响应代码:
{
"error" : "....",
"error_description" : "..."
"account-link-url" : "https://...."
}
{
"error" : "....",
"error_description" : "..."
"account-link-url" : "https://...."
}
错误 声明将是 token_expired 或 not_linked。提供了 account-link-url 声明,以便客户端能够执行客户端 初始帐户链接。大多数(如果不是全部)供应商需要通过浏览器 OAuth 协议链接。使用 account-link-url 仅向其添加一个 redirect_uri 查询参数,您可以转发浏览器来执行链接。