8.5. 请求方令牌
请求方令牌 (RPT) 是使用 JSON web signature (JWS) 进行了数字签名的 JSON web token (JWT)。该令牌基于之前由 Red Hat Single Sign-On 发布的 OAuth2 访问令牌来构建,该令牌代表用户或自行代表。
当解码 RPT 时,您会看到类似如下的有效负载:
通过此令牌,您可以从 权限 声明获取服务器授予的所有权限。
另请注意,权限与您所使用的资源/范围直接相关,并完全脱离用于实际授予和签发相同的权限的访问控制方法。
8.5.1. 内省请求方令牌 复制链接链接已复制到粘贴板!
有时,您可能希望内省请求方令牌(RPT)来检查其有效期,或获取令牌中的权限,以便在资源服务器端强制执行授权决策。
有两个主要用例,令牌内省可帮助您:
- 当客户端应用程序需要查询令牌有效期以获取具有相同或额外权限的新值时
- 在资源服务器端 强制实施授权决策时,特别是当没有内置策略强制器 适合应用程序时
8.5.2. 获取有关 RPT 的信息 复制链接链接已复制到粘贴板!
令牌内省本质上是 OAuth2 令牌内省- 兼容端点,您可以获取有关 RPT 的信息。
http://${host}:${port}/auth/realms/${realm_name}/protocol/openid-connect/token/introspect
http://${host}:${port}/auth/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/auth/realms/hello-world-authz/protocol/openid-connect/token/introspect"
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/auth/realms/hello-world-authz/protocol/openid-connect/token/introspect"
以上请求使用 HTTP BASIC 并通过客户端凭证(客户端 ID 和 secret)来验证客户端试图内省令牌,但您可以使用 Red Hat Single Sign-On 支持的任何其他客户端身份验证方法。
内省端点需要两个参数:
token_type_hint
使用 request_party_token 作为此参数的值,这表示您要内省 RPT。
token
使用令牌字符串,因为服务器在授权过程中返回,作为此参数的值。
因此,服务器响应是:
如果 RPT 没有被激活,则会返回这个响应:
{ "active": false }
{
"active": false
}
8.5.3. 每次要内省 RPT 时,我是否需要调用服务器? 复制链接链接已复制到粘贴板!
不如 Red Hat Single Sign-On 服务器发布的常规访问令牌,RPTs 也使用 JSON Web 令牌(JWT)规范作为默认格式。
如果要在没有调用远程内省端点的情况下验证这些令牌,您可以在本地解码 RPT 和查询其有效性。对令牌进行解码后,您还可以使用令牌中的权限来强制执行授权决策。
这基本上是策略执行者的作用。确保:
- 验证 RPT 的签名(基于域的公钥)
- 基于它的 exp, iat, 和 aud 声明来查询令牌的有效性。