8.5. 请求方令牌
请求方令牌 (RPT) 是使用 JSON web signature (JWS) 进行了数字签名的 JSON web token (JWT)。该令牌基于之前由红帽构建的 Keycloak 签发的 OAuth2 访问令牌构建,用于代表用户或其自有的特定客户端。
当您解码 RPT 时,您会看到类似如下的有效负载:
{ "authorization": { "permissions": [ { "resource_set_id": "d2fe9843-6462-4bfc-baba-b5787bb6e0e7", "resource_set_name": "Hello World Resource" } ] }, "jti": "d6109a09-78fd-4998-bf89-95730dfd0892-1464906679405", "exp": 1464906971, "nbf": 0, "iat": 1464906671, "sub": "f1888f4d-5172-4359-be0c-af338505d86c", "typ": "kc_ett", "azp": "hello-world-authz-service" }
在这个令牌中,您可以从 权限 声明中获取服务器授予的所有权限。
另请注意,权限直接与您要保护的资源/范围相关,并与用于实际授予和发出这些相同权限的访问控制方法完全分离。
8.5.1. 内省请求方令牌
有时,您可能希望内省请求方令牌(RPT)来检查其有效性,或者在令牌内获取权限,以对资源服务器端实施授权决策。
令牌内省可帮助您两个主要的用例:
- 当客户端应用程序需要查询令牌的有效性时,以获取具有相同或额外权限的新令牌
- 在资源服务器端强制授权决策时,特别是没有内置 策略强制器 适合您的应用程序
8.5.2. 获取有关 RPT 的信息
令牌内省基本上是一个 OAuth2令牌内省 - 兼容端点,您可以从中获取有关 RPT 的信息。
http://${host}:${port}/realms/${realm_name}/protocol/openid-connect/token/introspect
要使用此端点内省 RPT,您可以按如下方式向服务器发送请求:
curl -X POST \ -H "Authorization: Basic aGVsbG8td29ybGQtYXV0aHotc2VydmljZTpzZWNyZXQ=" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d 'token_type_hint=requesting_party_token&token=${RPT}' \ "http://localhost:8080/realms/hello-world-authz/protocol/openid-connect/token/introspect"
以上请求使用 HTTP BASIC 并传递客户端的凭据(客户端 ID 和 secret)来验证尝试内省令牌的客户端,但您可以使用红帽构建的 Keycloak 支持的任何其他客户端验证方法。
内省端点需要两个参数:
token_type_hint
使用 request_party_token 作为此参数的值,这表示您要内省 RPT。
token
在授权过程中,使用令牌字符串(由服务器返回)作为此参数的值。
因此,服务器响应是:
{ "permissions": [ { "resource_id": "90ccc6fc-b296-4cd1-881e-089e1ee15957", "resource_name": "Hello World Resource" } ], "exp": 1465314139, "nbf": 0, "iat": 1465313839, "aud": "hello-world-authz-service", "active": true }
如果 RPT 未激活,则返回此响应:
{ "active": false }
8.5.3. 每次我想要内省 RPT 时,我是否需要调用服务器?
否。就像红帽构建的 Keycloak 服务器发布的常规访问令牌一样,RPT 也使用 JSON Web 令牌(JWT)规格作为默认格式。
如果要在不调用远程内省端点的情况下验证这些令牌,您可以解码 RPT,并在本地查询其有效性。解码令牌后,您也可以使用令牌中的权限来强制实施授权决策。
这基本上是策略执行者的作用。请确定:
- 验证 RPT 的签名(基于域的公钥)
- 基于它的 exp, iat, 和 aud 声明来查询令牌的有效性。
其他资源