第 12 章 使用令牌交换
令牌交换是 预览 的,不受支持。此功能默认为禁用。
使用-- features=preview
or-- features=token-exchange
启用服务器
令牌交换 是技术预览,不受支持。
12.1. 令牌交换的工作方式 复制链接链接已复制到粘贴板!
在 Red Hat build of Keycloak 中,令牌交换是使用一组凭证或令牌获取完全不同的令牌的过程。客户端可能想要在不太信任的应用上调用,因此可能希望降级它具有的当前令牌。客户端可能希望为链接的社交供应商帐户存储的令牌交换红帽构建的 Keycloak 令牌。您可能希望信任外部令牌,由其他红帽构建 Keycloak 域或外部 IDP 最小化。客户端可能需要模拟用户。以下是红帽围绕令牌交换构建的 Keycloak 当前功能的简短概述。
- 客户端可以交换为特定客户端创建用于不同客户端的新令牌的现有红帽构建的 Keycloak 令牌
- 客户端可以为外部令牌交换现有红帽构建的 Keycloak 令牌,例如链接的 Facebook 帐户
- 客户端可以为红帽构建的 Keycloak 令牌交换外部令牌。
- 客户端可以模拟用户
红帽构建的 Keycloak 中的令牌交换是 IETF 中对 OAuth Token Exchange 规格的非常松散的实现。我们已对其进行扩展,忽略其中的一些内容,并松散地解释规格的其他部分。它是对域的 OpenID Connect 令牌端点的简单授权类型调用。
/realms/{realm}/protocol/openid-connect/token
/realms/{realm}/protocol/openid-connect/token
它接受表单参数(application/x-www-form-urlencoded
)作为输入,输出取决于您请求交换的令牌类型。令牌交换是一个客户端端点,因此请求必须为调用客户端提供身份验证信息。公共客户端将其客户端标识符指定为表单参数。机密客户端也可以使用表单参数传递其客户端 ID 和机密(Basic Auth),或者您的 admin 已在您的域中配置了客户端身份验证流。
12.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
-
可选。这个参数指定客户端需要外部供应商 mint 的令牌。它必须是域中
配置的身份提供程序
的别名。 - requested_subject
- 可选。如果您的客户端希望模拟其他用户,则指定用户名或用户 id。
- scope
- 可选。此参数代表客户端要请求的 OAuth 和 OpenID Connect 范围的目标集合。返回的范围是 scope 参数和访问令牌范围的 Cartesian 产品。
我们目前仅支持 OpenID Connect 和 OAuth 交换。以后可能会添加对基于 SAML 的客户端和身份提供程序的支持,具体取决于用户的需求。
12.1.2. 来自令牌交换请求的响应 复制链接链接已复制到粘贴板!
来自交换调用的成功响应将返回 HTTP 200 响应代码,其内容类型取决于 requested-token-type
和 requested_issuer
。OAuth 请求的令牌类型将返回 JSON 文档,如 OAuth 令牌交换 规格中所述。
{ "access_token" : ".....", "refresh_token" : ".....", "expires_in" : "...." }
{
"access_token" : ".....",
"refresh_token" : ".....",
"expires_in" : "...."
}
请求刷新令牌的客户端将在响应中返回访问和刷新令牌。仅请求访问令牌类型的客户端仅在响应中获取访问令牌。对于通过 requested_issuer
参数请求外部签发者的客户端,可能无法包含过期信息。
错误响应通常属于 400 HTTP 响应代码类别,但可能会返回其他错误状态代码,具体取决于错误的严重性。错误响应可能会包含的内容,具体取决于 requested_issuer
。基于 OAuth 的交换可能会返回 JSON 文档,如下所示:
{ "error" : "...." "error_description" : "...." }
{
"error" : "...."
"error_description" : "...."
}
根据交换类型,可能会返回其他错误声明。例如,如果用户没有到身份提供程序的链接,OAuth 身份提供程序可能包含额外的 account-link-url
声明。此链接可用于客户端发起的链接请求。
令牌交换设置需要了解 admin 权限(如需更多信息,请参阅 服务器管理指南 )。您需要授予客户端权限来交换。本章稍后将对此进行进一步的讨论。
本章的其余部分讨论了设置要求,并为不同的交换场景提供示例。为了简单起见,让我们调用当前域以 内部 令牌为 mint 的令牌,以及外部域或身份提供程序以 外部 令牌为 mint 的令牌。