在同一个领域中客户端可以将为特定客户端创建的现有 Keycloak 令牌交换为针对不同客户端的新令牌。客户可以将现有的 Keycloak 令牌兑换为外部令牌例如关联的 Facebook 账户令牌。客户端可以将外部令牌兑换为 Keycloak 令牌。客户可以冒充用户。在Keycloak 14.0.0版本中即使启用了-Dkeycloak.profile.feature.token_exchangeenabled预览功能客户端配置页面中确实不会直接显示exchange token选项。这是因为旧版令牌交换V1需要额外的细粒度权限配置。keycloak14中开启交换Token功能Keycloak 14.0.0需要同时启用两个预览功能,需要使用下划线的名字-Dkeycloak.profile.feature.admin_fine_grained_authzenabled -Dkeycloak.profile.feature.token_exchangeenabled重启Keycloak服务使配置生效。为客户端开启token exchnage能力添加一个wso2的IDP认证服务IDP中Permission的配置测试步骤1 用户在keycloak平台登录curl -X POST https://kc.com/auth/realms/demoo/protocol/openid-connect/token -H Accept: application/json --data-urlencode grant_typepassword --data-urlencode usernametest --data-urlencode password123456 --data-urlencode client_idwso2 --data-urlencode client_secretabf99c64-db24-43fb-b63b-c60213b8052f --data-urlencode scopeopenid2 用户在wso2平台通过urn:ietf:params:oauth:grant-type:jwt-bearer方式生成对应的tokencurl -X POST https://wso2.com/oauth2/token -H Content-Type: application/json -H Content-Type: application/json -u 3N5OKJnQozVc8pPKWHSf1CTLgwQa:HEj3QGF3bPxLIJbTpEmanW5mIjEa --basic -d { grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer, assertion: kc-access-token, scope: openid apim:subscribe }3 用户在keycloak平台根据wso2的token来校验成keycloak的token注意wso2中的客户端生成的token类型可以是jwt类型和default类型但scope中必须包含openid的否则无法获取oauth2/userinfo接口。curl -X POST https://kc.com/auth/realms/fabao/protocol/openid-connect/token -H Content-Type: application/x-www-form-urlencoded -u wso2:abf99c64-db24-43fb-b63b-c60213b8052f --basic --data-urlencode grant_typeurn:ietf:params:oauth:grant-type:token-exchange --data-urlencode subject_tokenwso2-jwt-token --data-urlencode subject_token_typeurn:ietf:params:oauth:token-type:access_token --data-urlencode requested_token_typeurn:ietf:params:oauth:token-type:access_token --data-urlencode scopeopenid --data-urlencode subject_issuerwso2一点优化的空间目前wso2中api接口使用的token是用户的应用的token它是一种客户端认证目前客户端认证不支持scope的openid导致无法获取当前应用对应的用户/oauth2/userinfo接口导致这个token不支持token exchange但是如果你手动向idn_oauth2_access_token_scope表添加openid的scope它就可以调用/oauth2/userinfo接口了有几秒缓存。![](优化已经找到方法为sp应用添加openid的scope在acp的deployment.toml中添加相关配置