在微服务架构中,我们使用来自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文档中的示例有些抽象)。
最佳答案
我进入了文档,通过保护您的资源服务器(您的应用程序)以充当受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从应用程序中对其进行正确配置。