第 7 章 使用令牌交换
令牌交换 是技术预览,它不被完全支持。此功能默认为禁用。
要使用 -Dkeycloak.profile=preview
或 -Dkeycloak.profile.feature.token_exchange=enabled
来启用服务器启动。如需了解更多详细信息,请参阅 配置文件。
要使用令牌交换,您还应启用 token_exchange
功能。请查看 配置文件。
7.1. 令牌交换如何工作 复制链接链接已复制到粘贴板!
在红帽单点登录中,令牌交换是使用一组凭证或令牌集的过程,以获取完全不同的令牌。客户端可能想在不太可信的应用程序上调用,以便它希望降级其具有的当前令牌。客户端可能想要为已链接的社交帐户存储的令牌交换红帽单点登录令牌。您可能想信任被其他红帽单点登录域或外部 IDP 提供的外部令牌。客户端可能需要模拟用户。以下是 Red Hat Single Sign-On 令牌交换方面当前功能的简短摘要。
- 客户端可以交换为特定客户端为目标客户端创建的现有红帽单点登录令牌。
- 客户端可以为外部令牌交换现有红帽单点登录令牌,例如链接的 Facebook 帐户
- 客户端可以为红帽单点登录令牌交换外部令牌。
- 客户端可以模拟用户
Red Hat Single Sign-On 中的令牌交换是 IETF 上 OAuth 令牌交换 规范非常松散的实施。我们将其扩展了一个少,忽略了其中一些,并松散地解释该规范的其他部分。它是域的 OpenID Connect 令牌端点上的简单授权类型调用。
/auth/realms/{realm}/protocol/openid-connect/token
/auth/realms/{realm}/protocol/openid-connect/token
它接受表格参数(application/x-www-form-
url 编码的 )作为输入,输出取决于您请求交换的令牌类型。令牌交换是一个客户端端点,因此请求必须为调用客户端提供身份验证信息。公共客户端将其客户端标识符指定为表单参数。机密客户端也可以使用表单参数来传递其客户端 ID 和机密,或者您的管理员已在您的域中配置了客户端身份验证流。
7.1.1. 表单参数 复制链接链接已复制到粘贴板!
- client_id
- 必要可能。使用表单参数进行身份验证的客户端需要此参数。如果您使用 Basic Auth、客户端 JWT 令牌或客户端证书身份验证,则不要指定此参数。
- client_secret
- 必要可能。使用表单参数进行身份验证并使用客户端 secret 作为凭证的客户端需要此参数。如果域中的客户端调用通过不同的方式进行身份验证,则不要指定此参数。
- grant_type
-
必需。参数的值必须是
urn:ietf:params:oauth:grant-type:token-exchange
。 - subject_token
- 可选。代表发送请求者的身份的安全令牌。如果要交换新令牌的现有令牌,则需要此项。
- subject_issuer
-
可选。标识
subject_token
的签发者。如果令牌来自当前域,或者签发者是否可以从subject_token_type
中确定,则可以留空。否则需要指定它。有效值是为您的域配置的身份提供程序
的别名。或由特定身份提供程序配置的签发者声明标识符
。 - subject_token_type
-
可选。此参数是使用
subject_token
参数传递的令牌的类型。如果subject_token
来自域,则默认为urn:ietf:params:oauth:token-type:access_token
,则是一个访问令牌。如果是一个外部令牌,则根据subject_issuer
的要求,可能不必指定此参数。 - requested_token_type
-
可选。此参数代表客户端要交换的令牌类型。目前只支持 oauth 和 OpenID Connect 令牌类型。这样做的默认值取决于它是
urn:ietf:params:oauth:token-type:refresh_token
,在这种情况下,您会在响应中返回访问令牌和刷新令牌。其他适当的值有urn:ietf:params:oauth:token-type:access_token
和urn:ietf:params:oauth:token-type:id_token
- 培训对象
- 可选。此参数指定您希望新令牌被 mint 的目标客户端。
- requested_issuer
-
可选。此参数指定客户端希望由外部供应商报告令牌。它必须是在
域中配置的身份提供程序
的别名。 - requested_subject
- 可选。如果您的客户端希望模仿其他用户,则指定用户名或用户 id。
- scope
- 未实施。此参数代表客户端正在请求的目标 OAuth 和 OpenID Connect 范围。此时不会实施,但一旦红帽单点登录能够更好地支持一般范围。
我们目前仅支持 OpenID Connect 和 OAuth 交换。以后可能会根据用户需求添加对基于 SAML 的客户端和身份提供程序的支持。
7.1.2. 来自令牌交换请求的响应 复制链接链接已复制到粘贴板!
来自交换调用的成功响应将返回 HTTP 200 响应代码,它带有依赖于 requested-token-type
和 requested_issuer
请求的内容类型。OAuth 请求的令牌类型将返回 JSON 文档,如 OAuth Token Exchange 规范中所述。
{ "access_token" : ".....", "refresh_token" : ".....", "expires_in" : "...." }
{
"access_token" : ".....",
"refresh_token" : ".....",
"expires_in" : "...."
}
请求刷新令牌的客户端将在响应中返回访问和刷新令牌。仅请求访问令牌类型的客户端仅获得响应中的访问令牌。通过 requested_issuer
paramater 请求外部签发者的客户端可能会包含过期信息。
错误响应通常低于 400 HTTP 响应代码类别,但其他错误状态代码可以根据错误的严重性进行返回。错误响应可能包括内容取决于 requested_issuer
。基于 OAuth 的交换可能会返回 JSON 文档,如下所示:
{ "error" : "...." "error_description" : "...." }
{
"error" : "...."
"error_description" : "...."
}
可以根据交换类型返回额外的错误声明。例如,如果用户没有身份提供程序的链接,OAuth Identity Providers 可能包含额外的 account-link-url
声明。该链接可用于客户端发起链路请求。
令牌交换设置需要了解管理员权限(请参见《 服务器管理指南》 以了解。您需要授予客户端权限才能交换。本章稍后将对此进行探讨。
本章的其余部分介绍了设置要求,并为不同的交换场景提供示例。为了简单起见,可以将当前域报告为 内部 令牌来报告令牌,以及由外部域或身份提供程序报告的令牌作为 外部 令牌。