第 7 章 使用令牌交换
令牌交换 是技术预览,不被完全支持。此功能默认为禁用。
要使用 -Dkeycloak.profile=preview
或 -Dkeycloak.profile.feature.token_exchange=enabled
来启用服务器。如需了解更多详细信息,请参阅 配置文件。
要使用令牌交换,您还应启用 token_exchange
功能。请查看 配置文件。
7.1. 令牌交换如何工作
在 Red Hat Single Sign-On 中,令牌交换是使用一组凭证或令牌来获取完全不同的令牌的过程。客户端可能想要在较低的可信应用上调用,因此可能希望降低其具有的当前令牌。客户端可能希望为链接的社交供应商帐户存储的令牌交换红帽单点登录令牌。您可能希望信任由其他 Red Hat Single Sign-On 域或外部 IDP 分离的外部令牌。客户端可能需要模拟用户。以下是关于令牌交换的 Red Hat Single Sign-On 当前功能的简要概述。
- 客户端可以交换为针对不同客户端的新令牌创建的现有 Red Hat Single Sign-On 令牌
- 客户端可以为外部令牌交换现有红帽单点登录令牌,即链接的 Facebook 帐户
- 客户端可以为 Red Hat Single Sign-On 令牌交换外部令牌。
- 客户端可以模拟用户
Red Hat Single Sign-On 中的令牌交换是 IETF 中 OAuth Token Exchange 规格的松散实施。我们扩展了它,忽略其中的一些部分,并松散解释规范中的其他部分。它是在域的 OpenID Connect 令牌端点上调用的简单授权类型调用。
/auth/realms/{realm}/protocol/openid-connect/token
它接受表格参数(应用程序/x-www-form
-url 编码),输出取决于您请求的交换的令牌类型。令牌交换是客户端端点,因此请求必须为调用客户端提供身份验证信息。公共客户端将客户端标识符指定为表单参数。机密客户端也可以使用表单参数传递其客户端 ID 和机密,即 Basic Auth,或者您的管理员已在域中配置了客户端身份验证流。
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
来自 realm,则默认为urn:ietf:params:oauth:token-type:access_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" : "...." }
请求刷新令牌的客户端将在响应中返回访问和刷新令牌。仅请求访问令牌类型的客户端只获得响应中的访问令牌。对于通过 request _issuer
paramater 请求外部签发者的客户端,则过期信息可能或不包括。
错误响应通常低于 400 HTTP 响应代码类别,但根据错误的严重性,可能会返回其他错误状态代码。错误响应可能包括内容,具体取决于 requested_issuer
。基于 OAuth 的交换可能会返回 JSON 文档,如下所示:
{ "error" : "...." "error_description" : "...." }
根据交换类型,可能会返回其他错误声明。例如,如果用户没有到身份提供程序的链接,OAuth 身份提供程序可能包含额外的 account-link-url
声明。此链接可用于客户端发起的链接请求。
令牌交换设置需要了解 admin 权限(有关更多信息,请参阅 服务器管理指南 )。您需要授予客户端交换权限。本章后续部分将对此进行更为详细的探讨。
本章的其余部分讨论了设置要求,并提供了有关不同交换场景的示例。为了简单起见,让我们向当前域调用一个令牌,作为 内部 令牌,以及由外部域或身份提供程序作为 外部 令牌的 mint 令牌。