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 参数中指定的令牌格式的字符串。Red Hat build of Keycloak 支持两种令牌格式: urn: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.

  • permission_resource_format

    这个参数是可选的。代表格式的字符串,表示 permission 参数中的资源。可能的值有 iduriid 表示格式是 RESOURCE_IDURI 表示格式是 URI。如果没有指定,则默认为 id

  • permission_resource_matching_uri

    这个参数是可选的。指示在 permission 参数中以 URI 格式表示资源时是否使用路径匹配的值。如果没有指定,则默认为 false。

  • 受众

    这个参数是可选的。客户端希望访问的资源服务器的客户端标识符。如果定义了 permission 参数,则此参数是必需的。它充当红帽构建的 Keycloak 的提示,以指示应评估哪些权限的上下文。

  • response_include_resource_name

    这个参数是可选的。指示资源名称是否应包含在 RPT 的权限中的布尔值。如果为 false,则只包括资源标识符。

  • response_permissions_limit

    这个参数是可选的。整数 N,为 RPT 可以具有的权限数量定义限制。与 rpt 参数一同使用时,只有最后 N 请求的权限将保存在 RPT 中。

  • submit_request

    这个参数是可选的。指明服务器是否应该创建对权限票据引用的资源和范围的权限请求的布尔值。这个参数仅在与 ticket 参数一起使用作为 UMA 授权过程的一部分时才生效。

  • response_mode

    这个参数是可选的。一个字符串值,代表服务器应如何响应授权请求。当您主要对整个决策或服务器授予的权限而不是标准 OAuth2 响应具有权限时,此参数特别有用。可能的值有:

    • 决定

      表示来自服务器的响应应仅通过返回具有以下格式的 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}/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}/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}/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

如果红帽构建的 Keycloak 评估过程造成权限不足,它会发出与权限关联的 RPT:

红帽构建的 Keycloak 使用 RPT 响应客户端

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

在使用其他授权类型时,来自服务器的响应就像来自令牌端点的任何其他响应一样。RPT 可以从 access_token 响应参数获得。如果客户端没有授权,红帽构建的 Keycloak 会使用 403 HTTP 状态代码进行响应:

红帽构建的 Keycloak 拒绝授权请求

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 授权类型时,客户端可以使用其中任何一个验证方法:

  • bearer Token

    客户端应在 HTTP Authorization 标头中将访问令牌作为 Bearer 凭据发送到令牌端点。

    示例:使用访问令牌向令牌端点进行身份验证的授权请求

    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 Toggle word wrap

    当客户端代表用户代表时,此方法特别有用。在这种情况下,bearer 令牌是以前由 Red Hat build of Keycloak 向某些客户端发布的访问令牌,代表用户(或代表自己负责)。将评估权限,考虑访问令牌所代表的访问上下文。例如,如果对代表用户 A 的 Client A 发出访问令牌,则根据用户 A 具有访问权限的资源和范围授予权限。

  • 客户端凭证

    客户端可以使用红帽构建的 Keycloak 支持的任何客户端验证方法。例如,client_id/client_secret 或 JWT。

    示例:使用客户端 id 和 client 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"
    Copy to Clipboard Toggle word wrap

8.2.2. 推送声明

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

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

curl -X POST \
  http://${host}:${port}/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

© 2026 Red Hat