【问题标题】:Keycloak Impersonate钥匙斗篷模拟
【发布时间】:2019-03-03 16:23:04
【问题描述】:

我需要在 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 有它的奇迹模拟按钮,它做同样的事情,但我需要在管理控制台之外拥有它。有人可以帮助解决这个问题吗?非常感谢

【问题讨论】:

    标签: java session cookies keycloak impersonation


    【解决方案1】:

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

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

    我在测试期间忘记了这样做,并且遇到了一些问题。我知道帖子很旧,但仍有人在寻找此类信息:D

    希望对你有帮助

    【讨论】:

      【解决方案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 标头。如下图。

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

      【讨论】:

      • 非常感谢您的回答。它真的很有帮助。
      【解决方案3】:

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

      总的来说,我已经完成了:

      1. 在 Keycloak 中创建服务客户端(启用直接访问授权;启用服务帐户):向客户端添加模拟角色;
      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 服务器:Keycloak impersonation API not implemented

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-02
        • 1970-01-01
        • 2021-01-30
        • 2021-10-30
        • 2019-09-07
        • 1970-01-01
        • 2021-08-02
        • 2021-07-21
        相关资源
        最近更新 更多