不透明トークン (Opaque token)
認証 (Authentication) プロセス中にリソースが指定されていない場合、Logto は JWT ではなく不透明トークン (Opaque token) のアクセス トークンを発行します。不透明トークン (Opaque token) はランダムな文字列であり、JWT よりもはるかに短いです:
{
"access_token": "some-random-string", // 不透明トークン (Opaque token)
"expires_in": 3600,
"id_token": "eyJhbGc...aBc", // JWT
"scope": "openid profile email",
"token_type": "Bearer"
}
不透明トークン (Opaque token) は、 userinfo エンドポイント を呼び出したり、認証 (Authentication) が必要な保護されたリソースへアクセスするために使用できます。JWT ではないため、リソースサーバーはどのようにしてこれを検証できるのでしょうか?
Logto は、不透明トークン (Opaque token) を検証するための イントロスペクションエンドポイント を提供しています。デフォルトでは、イントロスペクションエンドポイントは /oidc/token/introspection であり、POST リクエストを受け付けます。必要なパラメーターは次のとおりです:
token: 検証したい不透明トークン (Opaque token)
このエンドポイントではクライアント認証も必要です。次のいずれかの方法を使用できます:
- HTTP Basic 認証:
AuthorizationヘッダーにBasic <base64-encoded-credentials>を指定します。クレデンシャルはクライアント ID とクライアントシークレットをコロン(:)で区切り、base64 エンコードしたものです。 - HTTP POST 認証:
client_idおよびclient_secretパラメーターを使用します:client_id: トークンをリクエストしたアプリケーションのクライアント IDclient_secret: トークンをリクエストしたアプリケーションのクライアントシークレット
クライアント ID(アプリ ID)およびクライアントシークレット(アプリシークレット)は、Logto の「従来の Web」または「マシン間通信」アプリケーションのいずれかのアプリクレデンシャルを使用できます。クレデンシャルが無効な場合、イントロスペクションエンドポイントはエラーを返します。
イントロスペクションエンドポイントは、トークンのクレーム (Claims) を含む JSON オブジェクトを返します:
{
"active": true, // トークンが有効かどうか
"sub": "1234567890", // トークンのサブジェクト (Subject)(ユーザー ID)
"acr": "urn:logto:acr:1fa", // 認証保証レベル(達成時)
"amr": ["pwd"], // インタラクションで使用された認証方法
"auth_time": 1787745600 // ユーザーが認証 (Authentication) した時刻(エポック秒)
}
トークンが無効な場合、active フィールドは false となり、他のクレーム (Claims) は省略されます。acr、amr、auth_time の検証方法については ステップアップ認証 (Step-up authentication) を参照してください。構造化された JWT アクセストークンは /oidc/token/introspection でイントロスペクトできないことに注意してください。必ず JWT アクセストークンの検証 をテナントの JWKS でローカルに行ってください。
イントロスペクションリクエストの非規範的な例を示します:
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 に置き換えてください。
不透明トークン (Opaque token) と組織 (Organizations)
不透明トークン (Opaque token) は、 userinfo エンドポイント を通じて組織 (Organization) メンバーシップ情報を取得するために使用できます。urn:logto:scope:organizations スコープをリクエストすると、userinfo エンドポイントは organizations(組織 ID)や organization_data など、ユーザーの組織 (Organization) 関連クレーム (Claims) を返します。
ただし、不透明トークン (Opaque token) は組織トークン (Organization token) として使用できません。組織トークン (Organization token) は常に JWT 形式で発行されます。理由は次のとおりです:
- 組織トークン (Organization token) には、リソースサーバーが検証する必要がある組織 (Organization) 固有のクレーム (Claims)(
organization_idやスコープされた権限など)が含まれます。 - JWT 形式により、リソースサーバーは追加の API コールなしでトークンを検証し、組織 (Organization) コンテキストを抽出できます。
組織トークン (Organization token) を取得するには、組織パラメーターを指定して リフレッシュトークンフロー または クライアントクレデンシャルフロー を使用する必要があります。