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: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_IDHQSCOPE_ID。例如: Resource AöScope A,Resource A HQScope A, Scope B, Scope C , Resource A ,Resource A , cope A.

  • permission_resource_format

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

  • permission_resource_matching_uri

    这个参数是可选的。指明在以 URI 格式代表 权限 参数的资源时是否要使用路径匹配的布尔值。如果没有指定,则默认为 false。

  • Audience

    这个参数是可选的。客户端要期望访问的资源服务器的客户端标识符。在定义 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
      }
      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: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"
    Copy to Clipboard Toggle word wrap

    当客户端代表用户时,此方法特别有用。在这种情况下,bearer 令牌是由红帽构建的 Keycloak 签发的访问令牌,代表用户(或代表自身)成为某些客户端。将评估权限,以考虑访问令牌表示的访问模式。例如,如果将访问令牌发布到代表用户 A 的客户端 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"
    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

© 2025 Red Hat