9.5. JavaScript 集成


红帽构建的 Keycloak 服务器附带了一个 JavaScript 库,可用于与策略实施器保护的资源服务器进行交互。这个库基于红帽构建的 Keycloak JavaScript 适配器,可以集成该适配器,以便您的客户端从红帽构建的 Keycloak 服务器获取权限。

您可以通过在网页中包含以下 脚本 标签,从正在运行的红帽构建的 Keycloak Server 实例获取此库:

<script src="http://.../js/keycloak-authz.js"></script>
Copy to Clipboard Toggle word wrap

接下来,您可以创建 KeycloakAuthorization 实例,如下所示:

const keycloak = ... // obtain a Keycloak instance from keycloak.js library
const authorization = new KeycloakAuthorization(keycloak);
Copy to Clipboard Toggle word wrap

keycloak-authz.js 库提供两个主要功能:

  • 如果您要访问 UMA 保护的资源服务器,请使用权限票据从服务器获取权限。
  • 通过发送应用想要访问的资源和范围从服务器获取权限。

在这两种情况下,该程序库都允许您轻松与资源服务器和红帽构建的 Keycloak 授权服务交互,以获取具有您的客户端权限的令牌,作为 bearer 令牌来访问资源服务器上的受保护的资源。

如果资源服务器受策略强制器保护,它会根据通过 bearer 令牌执行的权限响应客户端请求。通常,当您试图使用缺少访问受保护资源的 bearer 令牌访问资源服务器时,资源服务器会使用 401 状态代码和 WWW-Authenticate 标头进行响应。

HTTP/1.1 401 Unauthorized
WWW-Authenticate: UMA realm="${realm}",
    as_uri="https://${host}:${port}/realms/${realm}",
    ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
Copy to Clipboard Toggle word wrap

如需更多信息,请参阅 UMA 授权进程

客户端需要做什么是从资源服务器返回的 WWW-Authenticate 标头中提取权限票据,并使用库发送授权请求,如下所示:

// prepare a authorization request with the permission ticket
const authorizationRequest = {};
authorizationRequest.ticket = ticket;

// send the authorization request, if successful retry the request
Identity.authorization.authorize(authorizationRequest).then(function (rpt) {
    // onGrant
}, function () {
    // onDeny
}, function () {
    // onError
});
Copy to Clipboard Toggle word wrap

授权 功能是完全异步的,支持几个回调功能从服务器接收通知:

  • onGrant :函数的第一个参数。如果授权成功,且服务器返回具有请求权限的 RPT,则回调会收到 RPT。
  • onDeny :函数的第二个参数。只有服务器拒绝授权请求时调用。
  • onError :函数的第三个参数。只有服务器意外响应时调用。

大多数应用程序都应该使用 onGrant 回调在 401 响应后重试请求。后续请求应包括 RPT 作为重试的 bearer 令牌。

9.5.2. 获取权利

keycloak-authz.js 库提供了一个 授权 功能,您可以通过提供客户端想要访问的资源和范围从服务器获取 RPT。

有关如何获取 RPT 的示例,并具有用户可访问的所有资源和范围的权限

authorization.entitlement('my-resource-server-id').then(function (rpt) {
    // onGrant callback function.
    // If authorization was successful you'll receive an RPT
    // with the necessary permissions to access the resource server
});
Copy to Clipboard Toggle word wrap

有关如何获取具有特定资源和范围权限的 RPT 的示例

authorization.entitlement('my-resource-server', {
    "permissions": [
        {
            "id" : "Some Resource"
        }
    ]
}).then(function (rpt) {
    // onGrant
});
Copy to Clipboard Toggle word wrap

使用 授权 功能时,您必须提供您要访问的资源服务器的 client_id

授权 功能是完全异步的,支持几个回调功能从服务器接收通知:

  • onGrant :函数的第一个参数。如果授权成功,且服务器返回具有请求权限的 RPT,则回调会收到 RPT。
  • onDeny :函数的第二个参数。只有服务器拒绝授权请求时调用。
  • onError :函数的第三个参数。只有服务器意外响应时调用。

9.5.3. 授权请求

授权和 权利 功能都接受授权请求对象。此对象可使用以下属性设置:

  • 权限

    代表资源和范围的对象数组。例如:

    const authorizationRequest = {
       "permissions": [
           {
               "id" : "Some Resource",
               "scopes" : ["view", "edit"]
           }
       ]
    }
    Copy to Clipboard Toggle word wrap
  • metadata

    其属性的对象定义服务器如何处理授权请求。

    • response_include_resource_name

      如果资源名应包含在 RPT 的权限中,表示服务器的布尔值。如果为 false,则仅包含资源标识符。

    • response_permissions_limit

      为 RPT 可以具有的权限数量定义限制的整数 N。当与 rpt 参数一同使用时,只有最后 N 个请求的权限才会保留在 RPT 中

  • submit_request

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

9.5.4. 获取 RPT

如果您已使用库提供的任何授权功能获得 RPT,则始终可以从授权对象获取 RPT (假设它已被前面显示的一个技术初始化):

const rpt = authorization.rpt;
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat