Phi*_*ipp 10 rpt jwt microservices keycloak
在微服务架构中,我们使用来自keycloak的JWT令牌.现在我们希望获得具有较少权限的第二个访问令牌(减少声明/减少角色).用例是:新的访问令牌应该使其所有者只能访问文档存储中的一个文档.为什么?如果他可以偷走这个令牌,可以限制某人可以做的伤害.
理想情况下,我们可以通过特殊的refresh_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说:
... Keycloak授权服务提供对OAuth2的扩展,以允许基于与所请求的资源或范围相关联的所有策略的处理来发布访问令牌.这意味着资源服务器可以根据服务器授予的权限强制访问其受保护资源,并由访问令牌持有.在Keycloak授权服务中,具有权限的访问令牌称为请求方令牌或简称RPT.
这样的具有权限的访问令牌可以用于我们的目标吗?
在我的实验中,我可以使用grant_type = urn获取令牌:ietf:params:oauth:grant-type:uma-ticket.但是有一些问题:
我不得不更改keycloak中的一些设置以启用权限(在它说"客户端不支持权限"之前).在我做了这些更改之后,我的正常登录呼叫将不再有效(我可以在我的令牌仍然有效时进行测试).我不得不抓住我的keycloak配置继续工作.
我真的不了解用于此功能的权限模型
端到端示例很有用(Keycloak文档中的示例有点抽象).
我已经阅读了文档,通过保护您的资源服务器(您的应用程序)以充当 UMA 保护的资源服务器,您可以实现您想要的目标。这里有一个基本示例,说明了可以通过此实现什么:
\n\n\n\n\nKeycloak 是兼容 UMA 2.0 的授权服务器,提供大多数 UMA 功能。
\n\n例如,假设用户 Alice(资源所有者)使用 Internet 银行服务(资源服务器)来管理其银行帐户(资源)。有一天,爱丽丝决定向会计专业人士鲍勃\n(请求方)开设她的银行帐户。但是,Bob 应该仅有权查看(范围)Alice\xe2\x80\x99s 帐户。
\n\n作为资源服务器,网上银行服务必须能够保护 Alice\xe2\x80\x99s 银行帐户。为此,它依赖 Keycloak 资源注册端点在代表 Alice\xe2\x80\x99s 银行帐户的服务器中创建资源。
\n\n此时,如果Bob尝试访问Alice\xe2\x80\x99s银行帐户,访问将被拒绝。网上银行服务为银行帐户定义了一些默认策略。其中之一是只有所有者(在本例中为爱丽丝)才被允许访问她的银行帐户。
\n\n然而,关于 Alice\xe2\x80\x99s 隐私的网上银行服务还允许她更改银行帐户的特定政策。她可以更改的政策之一是定义允许哪些人查看她的银行帐户。为此,网上银行服务\n 依赖 Keycloak 向 Alice 提供一个空间,\n 她可以在其中选择\n 个人及其允许访问的操作(或数据)。\n Alice 可以随时撤销访问权限或授予额外的权限鲍勃的权限\n。
\n
然后使用策略执行器来触发此保护:
\n\n\n\n\n如果资源服务器受到策略执行器的保护,它将根据承载令牌附带的权限来响应客户端请求。通常,当您尝试使用不记名令牌访问资源服务器时,该令牌缺乏访问受保护资源的权限,资源服务器会使用 401 状态代码和 WWW-Authenticate 标头进行响应。
\n
HTTP/1.1 401 Unauthorized\nWWW-Authenticate: UMA realm="${realm}",\n as_uri="https://${host}:${post}/auth/realms/${realm}",\n ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"\nRun Code Online (Sandbox Code Playgroud)\n\n这里您需要做两部分。第一个是为要保护的应用程序路径添加策略实施。然后,重点来了,您需要配置 UMA 部分。UMA 的优点在于,它在授权过程中添加了一个额外的票证系统,并且该票证是按资源分配的(事实上,当您尝试访问受保护的资源时,它们会被分配)。
\n\n\n\n\n客户端请求受保护资源而不发送 RPT
\n
curl -X GET \\\n http://${host}:8080/my-resource-server/resource/1bfdfe78-a4e1-4c2d-b142-fc92b75b986f\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n资源服务器将响应发送回客户端,其中包含权限票证和 as_uri 参数以及 Keycloak 服务器的位置,票证应发送到该位置以获得 RPT。资源服务器以权限票证响应
\n
HTTP/1.1 401 Unauthorized\nWWW-Authenticate: UMA realm="${realm}",\n as_uri="https://${host}:${post}/auth/realms/${realm}",\n ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"\nRun Code Online (Sandbox Code Playgroud)\n\n因此,客户端请求资源,并获得一张带有 Keycloak 服务器位置的票证,以便用该票证交换 RPT。这是客户端 POST 令牌端点,以便获取 RPT:
\n\ncurl -X POST \\\n http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token \\\n -H "Authorization: Bearer ${access_token}" \\\n --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \\\n --data "ticket=${permission_ticket} \\\n --data "submit_request=true"\nRun Code Online (Sandbox Code Playgroud)\n\n这将为您提供 RPT,该 RPT 仅对访问您第一次请求的资源有效。说这个:
\n\n{\n "authorization": {\n "permissions": [\n {\n "resource_set_id": "d2fe9843-6462-4bfc-baba-b5787bb6e0e7",\n "resource_set_name": "Hello World Resource"\n }\n ]\n },\n "jti": "d6109a09-78fd-4998-bf89-95730dfd0892-1464906679405",\n "exp": 1464906971,\n "nbf": 0,\n "iat": 1464906671,\n "sub": "f1888f4d-5172-4359-be0c-af338505d86c",\n "typ": "kc_ett",\n "azp": "hello-world-authz-service"\n}\nRun Code Online (Sandbox Code Playgroud)\n\n您还需要管理用户对其资源的访问。这里是使用管理 UI 完成的,但您可能需要从应用程序中调用 Keycloak API 来正确配置它。
\n| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |