跳到主要内容

不透明令牌 (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_idclient_secret 参数:
    • client_id: 请求令牌的应用程序的客户端 ID
    • client_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。