跨领域的 Keycloak 令牌交换

时间:2021-01-18 14:14:51

标签: single-sign-on keycloak openid-connect keycloak-rest-api token-exchange

我们使用 Keycloak 12.02 进行此测试。

这个想法是我们有很多客户,我们都有自己的领域。我们希望能够为主域中的管理员/支持用户模拟任何非主域中的用户。

流程是:

  1. 使用超级用户/密码登录以登录 master 领域
  2. 获取所有可用领域及其用户的列表
  3. 制作一个请求,用该特定用户的新访问令牌交换当前访问令牌。

这是我无法上班的最后一步。

示例:

登录主域

token=$(curl -s -d 'client_id=security-admin-console' 
-d 'username=my-super-user' -d 'password=my-super-pass' \
-d 'grant_type=password' \
'https://login.example.net/auth/realms/master/protocol/openid-connect/token' | jq -r .access_token)

(我们现在有一个主域中超级用户的访问令牌)

Keycloak 服务器已启用令牌交换 (-Dkeycloak.profile.feature.token_exchange=enabled),如此处 https://www.keycloak.org/docs/latest/securing_apps/#_token-exchange 所述。

尝试冒充另一个领域(非主)中的用户:

curl -s -X POST "https://login.example.net/auth/realms/some_realm/protocol/openid-connect/token" \
 -H "Content-Type: application/x-www-form-urlencoded" \
 --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
 -d 'client_id=some_client' \
 -d "requested_subject=some_user" \
 -d "subject_token=$token"

然而,这不起作用。结果是:{"error":"invalid_token","error_description":"Invalid token"}

(在单个领域内执行此操作)

我在这里做错了什么?这似乎是在实际部署中使用的非常正常的功能,因此非常感谢您的帮助!

更新: 首先,我在这里找到了相同的用例:https://lists.jboss.org/pipermail/keycloak-user/2019-March/017483.html

此外,我可以通过解决一些主要问题来使其工作。如上所述,可以使用 broker 领域中的 master 客户端作为身份提供者:

  • 以超级用户身份登录 adminA -> TokenA
  • 使用 TokenATokenExt 身份提供者获取新的外部令牌 master
  • 使用 TokenExt 为您要模拟的用户进行令牌交换

上面的警告是用户 adminA 是在您使用此方法登录的每个领域中创建的,因此仍然不理想。

0 个答案:

没有答案