Keycloak模仿

时间:2018-09-27 17:32:22

标签: java session cookies keycloak impersonation

我需要在Keycloak管理控制台之外提供模拟功能,该功能非常类似于“模拟”按钮。 我正在做的是为

调用Keycloak REST API
  1. 获取access_token,(auth / realms / master / protocol / openid-connect / token)
  2. 然后被解析为另一个模拟用户admin / realms / {realm} / users / {id} / impersonation的调用。

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

我需要以某种方式从应用程序中注销用户,在浏览器中设置这些cookie,执行重定向到登录页面并以其他用户身份登录。我认为它的常见情况和Keycloak都有其奇迹般的Impersonate按钮,它的功能相同,但是我需要在管理控制台之外使用它。有人可以协助解决这个问题吗?非常感谢

2 个答案:

答案 0 :(得分:2)

现在做出回应为时已晚,但如果有人仍在寻找简单的解决方案,它会有所帮助。我们遇到了同样的用例,我们想在 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 标头。像下图。 enter image description here

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

答案 1 :(得分:1)

我刚刚为我们的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

我希望这对您有帮助