8.2. 获取权限
要从 Red Hat Single Sign-On 获取权限,您需要将授权请求发送到令牌端点。因此,Red Hat Single Sign-On 将评估与请求资源相关的所有策略和范围,并发出包含服务器授予的所有权限的 RPT。
客户端可使用以下参数将授权请求发送到令牌端点:
grant_type
此参数是必需的。必须是
urn:ietf:params:oauth:grant-type:uma-ticket。ticket
这个参数是可选的。客户端收到的最新权限票据,作为 UMA 授权过程的一部分。
claim_token
这个参数是可选的。代表在评估请求资源的权限时,服务器应考虑的额外声明的字符串。这个参数允许客户端将声明推送到 Red Hat Single Sign-On。有关所有支持的令牌格式的详情,请参阅
claim_token_format参数。claim_token_format
这个参数是可选的。指示
claim_token参数中指定的令牌格式的字符串。Red Hat Single Sign-On 支持两种令牌格式: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 A#Scope A,Resource A#Scope A, Scope B, Scope C,Resource A,#Scope A.audience
这个参数是可选的。客户端查找访问的资源服务器的客户端标识符。如果定义了
权限参数,则此参数是必须的。它充当 Red Hat Single Sign-On 的提示,以指示应评估其权限的上下文。response_include_resource_name
这个参数是可选的。代表服务器是否应该包含在 RPT 权限中的布尔值。如果为 false,则仅包括资源标识符。
response_permissions_limit
这个参数是可选的。为 RPT 的权限数量定义限值的整数 N。与
rpt参数一同使用时,只有最后 N 请求的权限才会保存在 RPT 中。submit_request
这个参数是可选的。布尔值指示服务器是否应创建对权限票据引用的资源和范围的权限。这个参数仅在将
ticket参数用作 UMA 授权进程的一部分时才有效。response_mode
这个参数是可选的。一个字符串值,代表服务器应如何响应授权请求。当您主要对总体决策或服务器授予的权限有关时,这个参数特别有用,而不是标准的 OAuth2 响应。可能的值有:
decision表示来自服务器的响应应该只通过返回带有以下格式的 JSON 来代表总体决策:
{ 'result': true }{ 'result': true }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果授权请求没有映射到任何权限,则返回
403HTTP 状态代码。权限表示来自服务器的响应应该包含服务器授予的任何权限,方法是返回带有以下格式的 JSON:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果授权请求没有映射到任何权限,则返回
403HTTP 状态代码。
当客户端想要访问由资源服务器保护的两个资源时,授权请求的示例。
当客户端想要访问由资源服务器保护的资源和范围时,授权请求的示例。
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 "audience={resource_server_client_id}"
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 "audience={resource_server_client_id}"
当客户端在作为授权过程中从资源服务器接收权限票据后,查询访问 UMA 保护的资源的示例:
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}
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}
如果 Red Hat Single Sign-On 评估过程会产生权限,则发出 RPT 与其关联了权限:
Red Hat Single Sign-On 使用 RPT 响应客户端
服务器的响应与使用某些其他授权类型时来自令牌端点的任何其他响应一样。RPT 可以从 access_token 响应参数获取。如果客户端没有获得授权,Red Hat Single Sign-On 会使用 403 HTTP 状态代码进行响应:
Red Hat Single Sign-On 拒绝授权请求
8.2.1. 客户端验证方法 复制链接链接已复制到粘贴板!
客户端需要向令牌端点进行身份验证,以获取 RPT。当使用 urn:ietf:params:oauth:grant-type:uma-ticket grant 类型时,客户端可以使用任何这些验证方法:
bearer 令牌
客户端应该在 HTTP 身份验证标头中将访问令牌作为 Bearer 凭据发送到令牌端点。
示例:使用访问令牌向令牌端点进行身份验证的授权请求
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"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"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当客户端代表用户时,此方法特别有用。在这种情况下,bearer 令牌是之前由 Red Hat Single Sign-On 颁发给一些代表用户(或代表自己)发布的访问令牌。将评估权限,以考虑访问令牌所代表的访问上下文。例如,如果向客户端 A 签发了访问令牌,代表 User A,则根据用户 A 可以访问的资源和范围授予权限。
客户端凭证
客户端可以使用 Red Hat Single Sign-On 支持的任何客户端身份验证方法。例如,client_id/client_secret 或 JWT。
示例:使用客户端 ID 和客户端 secret 进行令牌端点的授权请求
curl -X POST \ http://${host}:${port}/auth/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}/auth/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