JavaScript集成
Keycloak Server附带一个JavaScript库,可以使用它与与策略执行者保护的资源服务器进行交互。该库基于Keycloak JavaScript适配器,可以集成,以允许您的客户端从Keycloak服务器获取权限。
您可以通过在您的网页中包含以下脚本标签,从运行的Keycloak Server实例获取此库:
<script src="http://.../auth/js/keycloak-authz.js"></script>
一旦你这样做,你可以创建一个KeycloakAuthorization实例,如下所示:
var keycloak = ... // obtain a Keycloak instance from keycloak.js library
var authorization = new KeycloakAuthorization(keycloak);
keycloak-authz.js库提供两个主要功能:
- 处理来自由Keycloak Policy Enforcer保护的资源服务器的响应,并获取具有必要权限的请求方令牌(RPT),以获得对资源服务器上受保护资源的访问权限。
- 在这种情况下,库可以处理资源服务器使用的任何授权协议:UMA或授权。
- 使用授权API从Keycloak服务器获取权限。
在这两种情况下,库允许您轻松地与资源服务器和Keycloak进行交互,以获取具有客户端可以用作承载令牌来访问资源服务器上的受保护资源的权限的令牌。
处理来自资源服务器的授权响应
如果资源服务器受到策略执行者的保护,则会根据承载令牌携带的权限来响应客户机请求。通常,当您尝试访问具有访问受保护资源的权限的承载令牌的资源服务器时,资源服务器将使用401状态代码和WWW验证标头进行响应。
WWW-Authenticate标头的值取决于资源服务器正在使用的授权协议。无论使用什么协议,都可以使用KeycloakAuthorization实例来处理响应如下:
var wwwAuthenticateHeader = ... // extract WWW-Authenticate Header from the response in case of a 401 status code
authorization.authorize(wwwAuthenticateHeader).then(function (rpt) {
// onGrant callback function.
// If authorization was successful you'll receive an RPT
// with the necessary permissions to access the resource server
}, function () {
// onDeny callback function.
// Called when the authorization request is denied by the server
}, function () {
// onError callback function. Called when the server responds unexpectedly
});
authorize
功能是完全异步的,并且支持几个回调函数来从服务器接收通知:
onGrant
: 函数的第一个参数。如果授权成功并且服务器返回具有请求权限的RPT,则回调接收RPT.onDeny
: 函数的第二个参数。仅当服务器已拒绝授权请求时才调用.onError
:函数的第三个参数。仅当服务器意外响应时才调用。
大多数应用程序应该使用onGrant回调在401响应之后重试一个请求。后续请求应包括RPT作为重试的承载令牌。
获得权利
keycloak-authz.js库提供了一个授权功能,您可以使用该功能从使用授权API的服务器获取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
});
使用授权功能时,必须提供要访问的资源服务器的client_id。
授权功能是完全异步的,并且支持几个回调函数来从服务器接收通知
onGrant
: 函数的第一个参数。如果授权成功并且服务器返回具有请求权限的RPT,则回调接收RPT.onDeny
: 函数的第二个参数。只有当服务器拒绝授权请求时才调用onError
: 函数的第三个参数。仅当服务器意外响应时才调用。
获取RPT
如果您已经使用库提供的任何授权功能获得了RPT,则可以从授权对象(假定已通过之前显示的技术之一初始化)来获取RPT,方法如下:
var rpt = authorization.rpt;