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_ID#SCOPE_ID。例如: Resource AcmScope A,Resource A;Scope A, Scope B, Scope C,Resource A,#Scope A.

  • permission_resource_format

    这个参数是可选的。代表 权限 参数中资源的格式的字符串。可能的值有 iduriid 表示格式为 RESOURCE_IDURI 表示格式为 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
      }
      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 令牌

    客户端应将访问令牌作为 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 有权访问的资源和范围,将授予权限。

  • 客户端凭证

    客户端可以使用红帽构建的 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