我已经进入了文档,并且可以通过保护您的资源服务器(您的应用程序)以充当受 UMA 保护的资源服务器来实现您想要的。在这里,您有一个基本示例,说明了可以通过以下方式实现的目标:
Keycloak 是一个符合 UMA 2.0 的授权服务器,可提供大多数 UMA 功能。
例如,考虑用户 Alice(资源所有者)使用网上银行服务(资源服务器)来管理他的银行账户(资源)。有一天,爱丽丝决定向会计专业人士鲍勃(请求方)开设她的银行账户。但是,Bob 应该只能查看(范围)Alice 的帐户。
作为资源服务器,网上银行服务必须能够保护 Alice 的银行账户。为此,它依靠 Keycloak Resource Registration Endpoint 在服务器中创建代表 Alice 银行账户的资源。
此时,如果 Bob 试图访问 Alice 的银行账户,访问将被拒绝。网上银行服务为银行账户定义了一些默认策略。其中之一是只有所有者(在本例中为 Alice)才被允许访问她的银行账户。
然而,关于 Alice 隐私的网上银行服务也允许她更改银行账户的特定政策。她可以更改的其中一项政策是定义允许哪些人查看她的银行帐户。为此,网上银行服务依靠 Keycloak 向 Alice 提供一个空间,她可以在其中选择个人以及允许他们访问的操作(或数据)。在任何时候,Alice 都可以撤销访问或授予 Bob 额外的权限。
然后使用策略执行器来触发此保护:
如果资源服务器受到策略执行器的保护,它会根据承载令牌的权限响应客户端请求。通常,当您尝试使用无权访问受保护资源的不记名令牌访问资源服务器时,资源服务器会以 401 状态代码和 WWW-Authenticate 标头进行响应。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: UMA realm="${realm}",
as_uri="https://${host}:${post}/auth/realms/${realm}",
ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
这里有两个部分你需要做。第一个是为您要保护的应用程序路径添加策略实施。然后,酱汁来了,您需要配置 UMA 部分。UMA 的好处在于它在授权过程中添加了一个额外的票证系统,并且该票证是按资源分配的(实际上,它们是在您尝试访问受保护的资源时分配的)。
客户端请求受保护的资源而不发送 RPT
curl -X GET \
http://${host}:8080/my-resource-server/resource/1bfdfe78-a4e1-4c2d-b142-fc92b75b986f
资源服务器使用权限票证和 as_uri 参数将响应发送回客户端,其中包含 Keycloak 服务器的位置,以获取 RPT 票证应发送到的位置。资源服务器以许可票响应
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。这是客户端发布令牌端点,以便获取 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。说这个:
{
"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"
}
您还需要管理用户对其资源的访问。此处使用管理 UI 完成,但您可能需要从应用程序正确配置它,调用 Keycloak API。