9.5. JavaScript 集成
Red Hat Single Sign-On Server 附带一个 JavaScript 库,可用于与策略 enforcer 保护的资源服务器交互。这个程序库基于 Red Hat Single Sign-On JavaScript 适配器,它可集成来允许您的客户端从 Red Hat Single Sign-On Server 获取权限。
您可以通过在 web 页面中包括 以下脚本
标签,从正在运行的 Red Hat Single Sign-On Server 实例获取这个库:
<script src="http://.../auth/js/keycloak-authz.js"></script>
<script src="http://.../auth/js/keycloak-authz.js"></script>
完成此操作后,您可以创建一个 KeycloakAuthorization
实例,如下所示:
const keycloak = ... // obtain a Keycloak instance from keycloak.js library const authorization = new KeycloakAuthorization(keycloak);
const keycloak = ... // obtain a Keycloak instance from keycloak.js library
const authorization = new KeycloakAuthorization(keycloak);
keycloak-authz.js 库提供两个主要功能:
- 如果您要访问 UMA 保护的资源服务器,请使用权限 ticket 从服务器获取权限。
- 通过发送资源和范围来从服务器获取权限。
在这两种情况下,库都允许您轻松与资源服务器和 Red Hat Single Sign-On 授权服务交互,以获取您的客户端可以用作 bearer 令牌来访问资源服务器上的受保护资源。
9.5.1. 处理由 UMA-Protected 资源服务器的授权响应 复制链接链接已复制到粘贴板!
如果资源服务器受策略强制保护,它将根据与 bearer 令牌一起执行的权限响应客户端请求。通常,当您尝试使用 bearer 令牌访问访问受保护资源的权限的资源服务器时,资源服务器会以 401 状态代码和 WWW-Authenticate
标头响应。
HTTP/1.1 401 Unauthorized WWW-Authenticate: UMA realm="${realm}", as_uri="https://${host}:${port}/auth/realms/${realm}", ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
HTTP/1.1 401 Unauthorized
WWW-Authenticate: UMA realm="${realm}",
as_uri="https://${host}:${port}/auth/realms/${realm}",
ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
如需更多信息,请参阅 UMA 授权进程。
您的客户端需要从资源服务器返回的
标头中提取权限票据,并使用库发送授权请求,如下所示:
WWW-Authenticate
授权
功能完全异步,支持几个回调功能从服务器接收通知:
-
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 });
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
});
有关如何使用特定资源和范围的权限获取 RPT 的示例
使用 授权
功能时,您必须提供您要访问的资源服务器的 client_id。
权利
功能完全异步,并支持几个回调功能从服务器接收通知:
-
onGrant
:功能的第一个参数。如果授权成功,并且服务器返回了具有请求权限的 RPT,则回调将接收 RPT。 -
onDeny
:功能的第二个参数。只有服务器拒绝授权请求时调用。 -
onError
:功能的第三个参数。只有服务器意外响应时才调用。
9.5.3. 授权请求 复制链接链接已复制到粘贴板!
授权
功能都接受授权请求对象。这个对象可使用以下属性设置:
和授权
权限
代表资源和范围的对象数组。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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;
const rpt = authorization.rpt;