繁体   English   中英

钥匙斗篷模拟

[英]Keycloak Impersonate

我需要在 Keycloak 管理控制台之外提供模拟<\/strong>功能,这与模拟按钮非常相似。 我正在做的是调用 Keycloak REST API

  1. 获取access_token,(auth\/realms\/master\/protocol\/openid-connect\/token)<\/li>
  2. 然后将其解析为另一个模拟用户 admin\/realms\/{realm}\/users\/{id}\/impersonation 的调用。<\/li><\/ol>

    第二个调用返回带有布尔值的重定向链接,并且在标头中,除了其他之外,还有 KEYCLOAK_SESSION 和 KEYCLOAK_IDENTITY cookie。

    我需要以某种方式从应用程序中注销用户,在浏览器中设置这些 cookie,重定向到登录页面并以另一个用户身份登录。 我认为它的常见情况和 Keycloak 有它的奇迹模拟按钮,它做同样的事情,但我需要在管理控制台之外拥有它。 有人可以帮助解决这个问题吗? 非常感谢

这为时已晚,但如果有人仍在寻找简单的解决方案,它会有所帮助。 我们遇到了相同的用例,我们想在 Keyclaok 之外(在 OIDC 客户端中)提供模拟。 为了实现这一点,我们使用了 Keyclaok 模拟 rest API。 https://www.keycloak.org/docs-api/5.0/rest-api/index.html#_users_resource

请确保在调用此 API 之前向 Keycloak 登录用户提供模拟权限。 阅读以下链接的更多信息。 https://github.com/keycloak/keycloak-documentation/blob/master/securing_apps/topics/token-exchange/token-exchange.adoc#impersonation

此 API 发送完整的模拟用户详细信息作为响应,包括访问令牌、会话 cookie 和 cors 标头。 如下图。 在此处输入图像描述

我们利用 cors 标头 allow-credentials 并向 Keycloak 发送了一个带有“withCredentials: true”的 ajax 请求。 此选项指示浏览器用新的 cookie 替换所有 cookie。

我刚刚为我们的KC实现了此功能,我们采用的方法是使用REST api。 需要登录“超级用户”(有效的KC会话)。 然后他们可以发起模拟会话,我们选择使用用户名查找模拟对象。 一旦确认该人员存​​在于KC领域中,就可以为该人员创建UserSessionModel 然后创建一个登录cookie,我了解到KC AuthenticationManager有一个几乎很少的方法,它创建一个登录cookie并将其附加到响应头(真的很酷)。 然后,我将凭据(超级用户)存储在cookie中,并返回带有这些cookie的响应。 return REST方法是一个非常相似的过程,它采用的参数是不同的,因为我们需要将cookie传递回来并获取超级用户ID和他的会话ID。 一旦有了这些,就可以重复第一种方法(查找用户,找到会话而不是创建新会话,除非旧会话超时),然后重定向回源。 哦,别忘了结束模拟会话。

personYouImpersonatedSessionId = session.sessions().getUserSession(RealmModel,AuthSessionId)
if(!personYouImpersonatedSessionId) {
      session.sessions().removeUserSession(RealmModel,personYouImpersonatedSessionId)
}

我忘了在测试过程中这样做,并且遇到了一些问题。 我知道该帖子很旧,但是仍然有人在寻找这种类型的信息:D

我希望这有帮助

我一直在挖掘,以便为这个找到解决方案。 我终于找到了这篇文章: https ://blog.softwaremill.com/who-am-i-keycloak-impersonation-api-bfe7acaf051a。

总之,就我而言,我已经完成了:

  1. 在 Keycloak 中创建 service-client (Direct Access Grants Enabled; Service Accounts Enabled):为客户端添加模拟角色;
  2. 调用 REST API 生成中间令牌;
# Getting intermediate token
curl --location --request POST 'http://localhost:8080/auth/realms/MY_REALM/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=vanilla' \
--data-urlencode 'client_secret=c41da386-b4fc-4202-b799-53196284e44f' \
--data-urlencode 'grant_type=client_credentials'
  1. 调用 REST API 将令牌换成模拟访问令牌;
Impersonated user Access-Token
curl --location --request POST 'http://localhost:8080/auth/realms/MY_REALM/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=vanilla' \
--data-urlencode 'client_secret=c41da386-b4fc-4202-b799-53196284e44f' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'subject_token=<ACCESS_TOKEN_FROM_PREVIOUS_STEP_2> \
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'requested_subject=34307875-39a6-4828-8cf0-f59f403bd51f'
  1. 使用令牌访问所需的资源; 例如
curl --location --request GET 'http://localhost:8090/todos' \
--header 'Authorization: Bearer <ACCESS_TOKEN_FROM_PREVIOUS_STEP_3>'

注意:必须为交换令牌启用 Keycloak Server: 未实现 Keycloak 模拟 API

我正面临通过自定义 REST API 模拟的问题 - 在我的情况下,我看到 Cookie 没有创建 - 你能帮我解决这个问题吗?

admin\/realms\/{realm}\/users\/{id}\/impersonation 。

升级到 Keycloak 16.0 - 模拟不起作用 - KEYCLOAK_IDENTITY 和 KEYCLOAK_SESSION Cookie 未创建<\/a>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM