エラーメッセージ
"kid" invalid, unable to lookup correct key
別の表記
- "kid" empty, unable to lookup correct key
鍵の配列が渡されたときに `kid` ヘッダーのないトークンが来ると、「\"kid\" empty, unable to lookup correct key」がスローされます。
firebase/php-jwt (PHP) — UnexpectedValueException from JWT::decode with a key array
このエラーの意味
`JWT::decode` に鍵の配列(通常は `JWK::parseKeySet` で作成したもの)を渡しましたが、その配列にはトークンのヘッダーにある `kid` のエントリがありません。php-jwt は鍵を `kid` だけで厳密に選択し、ほかの鍵は試しません。関連するメッセージ「\"kid\" empty」は、トークンに `kid` がまったくないことを意味し、鍵の配列ではこれを解決できません。
発生する理由
キャッシュした鍵セットがローテーション前のままになっている
よくあるJWKS をファイル、データベース、長期間保持されるキャッシュに保存しているアプリケーションは、プロバイダーが鍵をローテーションした後も古い鍵 ID を持ち続けます。Google と Firebase は、トークンの署名鍵を数日ごとにローテーションしています。
別の発行者やプロジェクトの鍵セット
ときどき別のテナントの JWKS URL を使っている場合や、Firebase の ID トークンに Google の OAuth 用の証明書を使っている場合が該当します(Firebase は別の鍵の URL を使います)。
発行者が kid を設定していない
ときどき`kid` のないトークンは、鍵の配列ではなく、単一の `Key` オブジェクトでしか検証できません。
修正方法
- 1.
CachedKeySet を使う
CachedKeySet は PSR-6 を通じて JWKS をキャッシュし、未知の `kid` が届くと取得し直します。オプションのレート制限を使えば、ランダムな `kid` の値によって発行者に大量のリクエストが送られるのを防げます。
php use Firebase\JWT\CachedKeySet; // Refetches the JWKS when a token names a kid the cache does not have (rate-limited). $keys = new CachedKeySet($jwksUri, $httpClient, $httpFactory, $cachePool, 3600, true); $claims = JWT::decode($token, $keys); - 2.
kid を付けない発行者には単一の Key を渡す
発行者の鍵が 1 つだけで `kid` を省略している場合は、その鍵を直接渡してください。
php // Issuer without kid and with exactly one key: pass a Key object, not an array. $claims = JWT::decode($token, new Key($publicKeyPem, 'ES256'));