7.4. 外部令牌到内部令牌交换
您可以信任并交换外部身份提供程序用于内部令牌的外部令牌。这可用于在域间桥接,或只用于从您的社交提供程序信任令牌。它的工作方式与身份提供程序浏览器登录类似,如果新用户不存在,则会将新用户导入到您的域中。
外部令牌交换的当前限制是,如果外部令牌映射到现有用户,则不会允许交换,除非现有用户已具有外部身份提供程序的帐户链接。
当交换完成后,将在域内创建一个用户会话,您会收到访问或刷新令牌,具体取决于 requested_token_type
参数值。您应该注意,这个新用户会话会一直处于激活状态,直到被调用通过这个新访问令牌的域的注销端点为止。
这些类型的更改需要在管理控制台中需要配置的身份提供程序。
目前不支持 SAML 身份提供程序。Twitter 令牌不能交换。
7.4.1. 授予对交换的权限
在进行外部令牌交换之前,您可以为调用客户端授予该交换的权限。这个权限的方式相同,与 授予外部权限的内部 权限相同。
如果还提供一个 audience
参数,其值指向调用者之外的不同客户端,还必须授予调用客户端的权限,以便与 audience
参数的特定目标客户端交换。本节前面将讨论如何 执行此操作。
7.4.2. 发出请求
subject_token_type
必须是 urn:ietf:params:oauth:token-type:access_token
或 urn:ietf:params:oauth:token-type:jwt
。如果类型是 urn:ietf:params:oauth:token-type:access_token
,您指定 subject_issuer
参数,它需要是配置的身份供应商的别名。如果类型为 urn:ietf:params:oauth:token-type:jwt
,则提供程序将通过 JWT 中的 签发者
声明匹配,该提供商必须是提供程序的别名或提供程序配置中的注册签发者。
为进行验证,如果令牌是一个访问令牌,则会调用该提供程序的用户信息服务来验证令牌。成功调用意味着访问令牌有效。如果主体令牌是一个 JWT,如果提供程序启用了签名验证,则会试图进行尝试,否则它将默认在用户 info 服务上调用 以验证令牌。
默认情况下,Aded 内部令牌将使用调用客户端使用为调用客户端定义的协议映射程序来确定令牌中的内容。另外,您可以使用 audience
参数指定不同的目标客户端。
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=...." \ -d "subject_issuer=myOidcProvider" \ --data-urlencode "subject_token_type=urn:ietf:params:oauth:token-type:access_token" \ -d "audience=target-client" \ http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token
如果您的 requested_token_type
参数是一个刷新令牌类型,则响应将同时包含访问令牌、刷新令牌和过期。以下是您从这个调用中获取的 JSON 响应示例:
{ "access_token" : "....", "refresh_token" : "....", "expires_in" : 3600 }