本文へスキップ
ecdsa.com
firebase/php-jwt (PHP)PHP

エラーメッセージ

"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` がまったくないことを意味し、鍵の配列ではこれを解決できません。

発生する理由

修正方法

  1. 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. 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'));

関連するエラー

署名エラーデータベースをすべて見る