8.2. 获取权限
要从红帽构建的 Keycloak 获取权限,您需要向令牌端点发送授权请求。因此,红帽构建的 Keycloak 将评估与请求的资源和范围关联的所有策略,并使用服务器授予的所有权限发布 RPT。
客户端允许使用以下参数向令牌端点发送授权请求:
grant_type
这个参数是必需的。必须是
urn:ietf:params:oauth:grant-type:uma-ticket
。ticket
这个参数是可选的。客户端收到的最新权限票据作为 UMA 授权过程的一部分。
claim_token
这个参数是可选的。代表服务器在评估要请求的资源和范围时应考虑的额外声明的字符串。此参数允许客户端将声明推送到红帽构建的 Keycloak。有关所有支持的令牌格式的详情,请参阅
claim_token_format
参数。claim_token_format
这个参数是可选的。代表
claim_token
参数中指定的令牌格式的字符串。红帽构建的 Keycloak 支持两种令牌格式:urn:ietf:params:oauth:token-type:jwt
和https://openid.net/specs/openid-connect-core-1_0.html#IDToken
。urn:ietf:params:oauth:token-type:jwt
格式表示claim_token
参数引用访问令牌。https://openid.net/specs/openid-connect-core-1_0.html#IDToken
表示claim_token
参数引用 OpenID Connect ID Token。rpt
这个参数是可选的。之前发布的 RPT 还应在新配置中评估和添加权限。此参数允许拥有 RPT 的客户端在按需添加权限时执行增量授权。
权限
这个参数是可选的。代表一组一个或多个资源的字符串,以及客户端正在寻求访问的范围。这个参数可以被多次定义,以便请求多个资源和范围的权限。这个参数是
urn:ietf:params:oauth:grant-type:uma-ticket
授权类型的扩展,以便允许客户端在没有权限票据的情况下发送授权请求。字符串的格式必须是:RESOURCE_ID#SCOPE_ID
。例如:Resource AcmScope A
,Resource A;Scope A, Scope B, Scope C
,Resource A
,#Scope A
.permission_resource_format
这个参数是可选的。代表
权限
参数中资源的格式的字符串。可能的值有id
和uri
。id
表示格式为RESOURCE_ID
。URI
表示格式为URI
。如果未指定,则默认为id
。permission_resource_matching_uri
这个参数是可选的。指明在以 URI 格式代表
权限
参数的资源时是否要使用路径匹配的布尔值。如果没有指定,则默认为 false。受众
这个参数是可选的。客户端希望访问的资源服务器的客户端标识符。如果定义了
permission
参数,则此参数是必需的。它充当红帽构建的 Keycloak 的提示,以指示应评估哪些权限的上下文。response_include_resource_name
这个参数是可选的。指示服务器是否应当包含在 RPT 权限中的资源名称的布尔值。如果为 false,则仅包含资源标识符。
response_permissions_limit
这个参数是可选的。为 RPT 可以具有的权限数量定义限制的整数 N。与
rpt
参数一起使用时,只有最后 N 个请求的权限保存在 RPT 中。submit_request
这个参数是可选的。指示服务器是否应该创建权限请求到权限票据引用的资源和范围的布尔值。这个参数只有在与
ticket
参数一起使用时作为 UMA 授权过程的一部分时才有效。response_mode
这个参数是可选的。一个字符串值,代表服务器应如何响应授权请求。当您主要关注总体决策或服务器授予的权限,而不是标准的 OAuth2 响应时,此参数特别有用。可能的值有:
决定
表示来自服务器的响应应该只通过返回具有以下格式的 JSON 来代表总体决定:
{ 'result': true }
{ 'result': true }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果授权请求没有映射到任何权限,则返回
403
HTTP 状态代码。权限
通过返回具有以下格式的 JSON 来指示来自服务器的响应应包含服务器授予的任何权限:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果授权请求没有映射到任何权限,则返回
403
HTTP 状态代码。
当客户端希望访问由资源服务器保护的两个资源时,授权请求示例。
当客户端希望访问由资源服务器保护的任何资源和范围时,授权请求示例。注意:这不会评估所有资源的权限。相反,评估由资源服务器拥有的资源的权限(由请求用户拥有的),并明确授予其他所有者的请求用户的权限。
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 "audience={resource_server_client_id}"
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 "audience={resource_server_client_id}"
当客户端在从资源服务器获得权限票据作为授权过程的一部分后,寻求访问 UMA 保护的资源时,授权请求示例:
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.2.1. 客户端验证方法 复制链接链接已复制到粘贴板!
客户端需要向令牌端点进行身份验证以获取 RPT。当使用 urn:ietf:params:oauth:grant-type:uma-ticket
授权类型时,客户端可以使用以下任一身份验证方法:
bearer 令牌
客户端应将访问令牌作为 Bearer 凭据在 HTTP Authorization 标头中发送到令牌端点。
示例:使用访问令牌向令牌端点进行身份验证的授权请求
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"
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"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当客户端代表用户操作时,此方法特别有用。在这种情况下,bearer 令牌是由红帽构建的 Keycloak 签发的访问令牌,代表用户(或代表自身)成为某些客户端。将评估权限,考虑访问令牌代表的访问上下文。例如,如果向客户端 A 发出了访问令牌,则根据用户 A 有权访问的资源和范围,将授予权限。
客户端凭证
客户端可以使用红帽构建的 Keycloak 支持的任何客户端验证方法。例如,client_id/client_secret 或 JWT。
示例:使用客户端 id 和客户端 secret 向令牌端点进行身份验证的授权请求
curl -X POST \ http://${host}:${port}/realms/${realm}/protocol/openid-connect/token \ -H "Authorization: Basic cGhvdGg6L7Jl13RmfWgtkk==pOnNlY3JldA==" \ --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket"
curl -X POST \ http://${host}:${port}/realms/${realm}/protocol/openid-connect/token \ -H "Authorization: Basic cGhvdGg6L7Jl13RmfWgtkk==pOnNlY3JldA==" \ --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2.2. 推送声明 复制链接链接已复制到粘贴板!
从服务器获取权限时,您可以推送任意声明,以便在评估权限时将这些声明提供给您的策略。
如果您要在没有使用权限票据(UMA 流) 的情况下 从服务器获取权限,您可以将授权请求发送到令牌端点,如下所示:
claim_token
参数需要一个 BASE64 编码的 JSON,格式类似以下示例:
{ "organization" : ["acme"] }
{
"organization" : ["acme"]
}
格式需要一个或多个声明,每个声明的值必须是字符串数组。
8.2.2.1. 使用 UMA 推送声明 复制链接链接已复制到粘贴板!
有关如何使用 UMA 和权限票据时如何推送声明的更多详细信息,请参阅 权限 API