不透明令牌 (Opaque token)
在认证过程中,如果没有指定资源,Logto 将签发一个不透明访问令牌,而不是 JWT。不透明令牌是一个随机字符串,比 JWT 短得多:
{
"access_token": "some-random-string", // 不透明令牌
"expires_in": 3600,
"id_token": "eyJhbGc...aBc", // JWT
"scope": "openid profile email",
"token_type": "Bearer"
}
不透明令牌可用于调用 userinfo endpoint 并访问需要认证的受保护资源。由于它不是 JWT,资源服务器如何验证它?
Logto 提供了一个 introspection endpoint,可用于验证不透明令牌。默认情况下,introspection endpoint 是 /oidc/token/introspection
,并接受 POST
请求。以下参数是必需的:
token
: 要验证的不透明令牌
该 endpoint 还需要客户端认证。你可以使用以下方法之一:
- HTTP Basic 认证:使用
Authorization
头,值为Basic <base64-encoded-credentials>
。凭据必须是用冒号(:
)分隔的客户端 ID 和客户端密钥,并进行 base64 编码。 - HTTP POST 认证:使用
client_id
和client_secret
参数:client_id
: 请求令牌的应用程序的客户端 IDclient_secret
: 请求令牌的应用程序的客户端密钥
客户端 ID(应用 ID)和客户端密钥(应用密钥)可以是 Logto 中任何“传统 web”或“机器对机器”应用程序的应用凭据。如果凭据无效,introspection endpoint 将返回错误。
introspection endpoint 返回一个包含令牌声明的 JSON 对象:
{
"active": true, // 令牌是否有效
"sub": "1234567890" // 令牌的主体(用户 ID)
}
如果令牌无效,active
字段将为 false
,并且 sub
字段将被省略。
以下是 introspection 请求的非规范示例:
curl --location \
--request POST 'https://[tenant-id].logto.app/oidc/token/introspection' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=some-random-string' \
--data-urlencode 'client_id=1234567890' \
--data-urlencode 'client_secret=1234567890'
记得将 [tenant-id]
替换为你的租户 ID。