8.3. 用户管理的访问
红帽构建的 Keycloak 授权服务基于用户管理的访问或 UMA。UMA 是一个以以下方式增强 OAuth2 功能的规格:
隐私性
现在,用户隐私会变得很大的问题,因为更多的数据和设备可用并连接到云。通过 UMA 和红帽构建的 Keycloak,资源服务器可以增强其功能,以改进其资源如何保护用户隐私,其中根据用户定义的策略授予权限。
第三方授权
资源所有者(例如,常规最终用户)可以管理对资源的访问,并授权其他方(如常规最终用户)来访问这些资源。这与 OAuth2 不同,其同意代表一个用户,UMA 资源所有者能够以完全异步的方式同意对其他用户的访问。
资源共享
资源所有者允许管理其资源的权限,并决定谁可以访问特定资源以及如何。然后,红帽构建的 Keycloak 可以充当共享管理服务,以供资源所有者管理其资源。
红帽构建的 Keycloak 是一个与 UMA 2.0 兼容的授权服务器,可提供大多数 UMA 功能。
例如,假设用户 alice (资源所有者)使用互联网银行服务(资源服务器)来管理她的银行帐户(资源)。第一天,Alice 决定打开她的银行客户,到 Bob (请求方),是财务专家。但是,Bob 应该只具有查看(范围)AXX 帐户的权限。
作为资源服务器,互联网银行服务必须能够保护 alice 银行帐户。为此,它依赖于红帽构建的 Keycloak 资源注册端点,来在代表 alice 的 bank 帐户的服务器中创建一个资源。
目前,如果 Bob 试图访问 alice 的 bank 帐户,则拒绝访问。互联网银行服务为银行帐户定义了几个默认策略。其中之一就是,只有所有者(本例中为 alice)可以访问她的银行帐户。
但是,与 alice 的隐私相关的互联网银行服务也使她能够更改银行帐户的特定策略。她可以更改这些政策之一就是定义允许哪些人查看她的银行帐户。为此,互联网银行服务依赖于红帽构建的 Keycloak 来为 alice 提供空间,其中她可以选择允许其访问的个人和操作(或数据)。在任何时候,Alice 可以撤销访问权限,或向 bob 授予其他权限。
8.3.1. 授权过程 复制链接链接已复制到粘贴板!
在 UMA 中,当客户端尝试访问 UMA 保护的资源服务器时,授权过程会启动。
UMA 保护的资源服务器需要请求中的 bearer 令牌,其中令牌是 RPT。当客户端请求资源没有 RPT 时:
客户端请求受保护的资源而无需发送 RPT
curl -X GET \
http://${host}:${port}/my-resource-server/resource/1bfdfe78-a4e1-4c2d-b142-fc92b75b986f
curl -X GET \
http://${host}:${port}/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}:${port}/realms/${realm}",
ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
HTTP/1.1 401 Unauthorized
WWW-Authenticate: UMA realm="${realm}",
as_uri="https://${host}:${port}/realms/${realm}",
ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
权限票据是红帽构建的 Keycloak 权限 API 发布的特殊令牌类型。它们代表正在请求的权限(如资源和范围),以及与请求关联的任何其他信息。只有资源服务器才能创建这些令牌。
现在,客户端有权限票据以及红帽构建的 Keycloak 服务器的位置,客户端可以使用发现文档来获取令牌端点的位置并发送授权请求。
客户端向令牌端点发送授权请求,以获取 RPT
curl -X POST \
http://${host}:${port}/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}
curl -X POST \
http://${host}:${port}/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}
如果红帽构建的 Keycloak 评估过程会导致权限无效,它会发出与权限关联的 RPT:
红帽构建的 Keycloak 使用 RPT 响应客户端
在使用某些其他授权类型时,服务器的响应与来自令牌端点的任何其他响应类似。RPT 可以从 access_token 响应参数获取。如果客户端没有授权红帽构建 Keycloak 的权限以 403 HTTP 状态代码进行响应:
红帽构建的 Keycloak 拒绝授权请求
8.3.2. 提交权限请求 复制链接链接已复制到粘贴板!
作为授权过程的一部分,客户端首先需要从 UMA 保护的资源服务器获取权限票据,以便在红帽构建的 Keycloak Token Endpoint 中与 RPT 进行交换。
默认情况下,红帽构建的 Keycloak 会以 403 HTTP 状态代码进行响应,并在无法通过 RPT 发布客户端时发出 request_denied 错误。
红帽构建的 Keycloak 拒绝授权请求
这样的响应意味着红帽构建的 Keycloak 无法发布具有权限票据代表的 RPT。
在某些情况下,客户端应用程序可能希望启动异步授权流,并让请求的资源所有者决定是否应该授予访问权限。为此,客户端可以使用 commit _request 请求参数以及向令牌端点的授权请求:
使用 commit_request 参数时,红帽构建的 Keycloak 会为访问被拒绝的每个资源保留一个权限请求。创建后,资源所有者可以检查其帐户并管理其权限请求。
您可以将此功能视为应用程序中的 Request Access 按钮,其中用户可以要求其他用户访问其资源。
8.3.3. 管理对用户资源的访问 复制链接链接已复制到粘贴板!
用户可以使用红帽构建的 Keycloak 帐户控制台来管理对其资源的访问。要启用此功能,您必须首先为您的域启用用户管理的访问。
流程
- 登录 Admin 控制台。
- 单击菜单中的 Realm Settings。
- 将 用户管理的访问切换为 ON。
单击管理控制台右上角的用户名,再选择 Manage Account。
在菜单选项中,单击 My Resources。此时会显示一个带有以下选项的页面。
管理 我的资源
本节包含由用户拥有的所有资源的列表。用户可以单击资源以获取更多详细信息,并与他人共享资源。当某个权限请求等待批准时,将在资源名称旁边放置一个图标。这些请求连接到请求访问特定资源的方(用户)。用户可以批准或拒绝这些请求。您可以通过点图标来完成此操作
管理与我共享的资源
本节包含与用户共享的所有资源的列表。
通过访问此资源来管理人员
本节包含有权访问此资源的人员的列表。允许用户通过单击
Revoke按钮或删除特定的权限来撤销访问权限。与其它资源共享资源
通过键入其他用户的用户名或电子邮件,用户可以共享该资源并选择希望授予访问权限的权限。