在微服务架构中,我们使用来自keycloak的JWT token 。现在,我们希望获得权限更少( claim /角色更少)的第二个访问 token 。用例是:新的访问 token 应授予其所有者仅对文档存储中的一个文档的访问权限。为什么?为了限制损害,某人可以窃取此 token 。

理想情况下,我们可以通过特殊的refresh_token调用获得第二个 token (持有刷新 token 的用户有权获取完整的访问 token ,因此他也应该能够获得部分访问 token )。我们该怎么做?

使用范围似乎无效:仅在登录时评估给定范围的列表(因此在刷新 token 时,我无法采用范围列表)。

我还尝试了解https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_overview或RPT。但不幸的是,我缺少一些文档(并且我的尝试失败了)。

还有其他想法吗?也许甚至是显示如何执行此操作的示例?

稍后进行编辑,以使我对RPT的问题更加明确:
https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_overview说:



可以将具有权限的访问 token 用于我们的目标吗?

在我的实验中,我可以使用grant_type = urn:ietf:params:oauth:grant-type:uma-ticket获得 token 。但是有一些问题:

  • 我必须更改keycloak中的某些设置以启用权限(之前会显示“客户端不支持权限”)。进行这些更改之后,我的常规登录调用将不再起作用(我可以在 token 仍然有效的同时进行测试)。我必须抓紧自己的keycloak配置才能继续工作。
  • 我不太了解用于此功能的权限模型

  • 一个端到端的示例将很有用(Keycloak文档中的示例有些抽象)。

    最佳答案

    我进入了文档,通过保护您的资源服务器(您的应用程序)以充当受UMA保护的资源服务器,可以实现您想要的目标。 Here you have可以用此实现的基本示例:



    然后使用策略执行器以触发此保护:


    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: UMA realm="${realm}",
        as_uri="https://${host}:${post}/auth/realms/${realm}",
        ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
    

    这里有两个部分需要做。首先是add policy enforcement您想要保护的应用程序的路径。然后,调味料到了,您需要configure the UMA part。关于UMA的优点在于,它在授权过程中添加了一个额外的票证系统,并且该票证是按资源分配的(实际上,当您尝试访问 protected 资源时,它们是分配的)。


    curl -X GET \
      http://${host}:8080/my-resource-server/resource/1bfdfe78-a4e1-4c2d-b142-fc92b75b986f
    


    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: UMA realm="${realm}",
        as_uri="https://${host}:${post}/auth/realms/${realm}",
        ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
    

    因此,客户端请求资源,并为其提供了带有Keycloak服务器位置的票证,以便将该票证交换为RPT。然后,这是客户端发布 token 端点的步骤,以便获得RPT:
    curl -X POST \
      http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token \
      -H "Authorization: Bearer ${access_token}" \
      --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
      --data "ticket=${permission_ticket} \
      --data "submit_request=true"
    

    这将为您提供RPT,该RPT仅对于访问您第一次请求的资源有效。说这个:
    {
      "authorization": {
          "permissions": [
            {
              "resource_set_id": "d2fe9843-6462-4bfc-baba-b5787bb6e0e7",
              "resource_set_name": "Hello World Resource"
            }
          ]
      },
      "jti": "d6109a09-78fd-4998-bf89-95730dfd0892-1464906679405",
      "exp": 1464906971,
      "nbf": 0,
      "iat": 1464906671,
      "sub": "f1888f4d-5172-4359-be0c-af338505d86c",
      "typ": "kc_ett",
      "azp": "hello-world-authz-service"
    }
    

    您还需要manage users access to their resources。在这里,它是使用管理UI完成的,但是您可能需要通过调用Keycloak API从应用程序中对其进行正确配置。

    09-11 18:49
    查看更多