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 支持两种令牌格式:ur n:ietf:params:oauth:token-type:jwthttps://openid.net/specs/openid-connect-core-1_0.html#IDTokenurn: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
      }
      Copy to Clipboard Toggle word wrap

      如果授权请求没有映射到任何权限,则返回 403 HTTP 状态代码。

    • 权限

      表示来自服务器的响应应该包含服务器授予的任何权限,方法是返回带有以下格式的 JSON:

      [
          {
              'rsid': 'My Resource'
              'scopes': ['view', 'update']
          },
      
          ...
      ]
      Copy to Clipboard Toggle word wrap

      如果授权请求没有映射到任何权限,则返回 403 HTTP 状态代码。

当客户端想要访问由资源服务器保护的两个资源时,授权请求的示例。

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}" \
  --data "permission=Resource A#Scope A" \
  --data "permission=Resource B#Scope B"
Copy to Clipboard Toggle word wrap

当客户端想要访问由资源服务器保护的资源和范围时,授权请求的示例。

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}"
Copy to Clipboard Toggle word wrap

当客户端在作为授权过程中从资源服务器接收权限票据后,查询访问 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}
Copy to Clipboard Toggle word wrap

如果 Red Hat Single Sign-On 评估过程会产生权限,则发出 RPT 与其关联了权限:

Red Hat Single Sign-On 使用 RPT 响应客户端

HTTP/1.1 200 OK
Content-Type: application/json
...
{
    "access_token": "${rpt}",
}
Copy to Clipboard Toggle word wrap

服务器的响应与使用某些其他授权类型时来自令牌端点的任何其他响应一样。RPT 可以从 access_token 响应参数获取。如果客户端没有获得授权,Red Hat Single Sign-On 会使用 403 HTTP 状态代码进行响应:

Red Hat Single Sign-On 拒绝授权请求

HTTP/1.1 403 Forbidden
Content-Type: application/json
...
{
    "error": "access_denied",
    "error_description": "request_denied"
}
Copy to Clipboard Toggle word wrap

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"
    Copy to Clipboard Toggle word wrap

    当客户端代表用户时,此方法特别有用。在这种情况下,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"
    Copy to Clipboard Toggle word wrap

8.2.2. 推送声明

从服务器获取权限时,您可以推送任意声明,以便在评估权限时将这些声明提供给您的策略。

如果您在不使用权限票据(UMA 流) 的情况下 从服务器获取权限,您可以按照以下方法向令牌端点发送授权请求:

curl -X POST \
  http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token \
  --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
  --data "claim_token=ewogICAib3JnYW5pemF0aW9uIjogWyJhY21lIl0KfQ==" \
  --data "claim_token_format=urn:ietf:params:oauth:token-type:jwt" \
  --data "client_id={resource_server_client_id}" \
  --data "client_secret={resource_server_client_secret}" \
  --data "audience={resource_server_client_id}"
Copy to Clipboard Toggle word wrap

claim_token 参数需要一个类似于以下示例的 BASE64 编码 JSON:

{
    "organization" : ["acme"]
}
Copy to Clipboard Toggle word wrap

格式需要一个或多个声明,其中每个声明的值都必须是一个字符串数组。

8.2.2.1. 使用 UMA 推送声明

有关如何使用 UMA 和权限票据时如何推送声明的更多详细信息,请参阅 权限 API

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat