我们使用 Keycloak 12.02 进行此测试。
这个想法是我们有很多客户,我们都有自己的领域。我们希望能够为主领域中的管理员/支持用户模拟任何非主领域中的用户。
流程将是:
- 使用超级用户/密码登录以登录
master
领域 - 获取所有可用领域及其用户的列表
- 为该特定用户制作一个将当前访问令牌与新访问令牌交换的请求。
这是我无法开始工作的最后一步。
例子:
登录到主域
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
- 用于从身份提供者
TokenA
获取新的外部令牌。TokenExt
master
- 用于
TokenExt
为您要模拟的用户进行令牌交换
上面的警告是,用户adminA
是在您使用此方法登录的每个领域中创建的,因此仍然不理想。