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

エラーメッセージ

Firebase\JWT\SignatureInvalidException: Signature verification failed

別の表記

  • PHP Fatal error: Uncaught Firebase\JWT\SignatureInvalidException: Signature verification failed

例外がキャッチされない場合、PHP は「PHP Fatal error: Uncaught Firebase\JWT\SignatureInvalidException: Signature verification failed in …/JWT.php」と出力します。

firebase/php-jwt (PHP) — Firebase\JWT\SignatureInvalidException from JWT::decode

このエラーの意味

php-jwt はトークンをパースし、渡された鍵に対するアルゴリズムを受け入れましたが、署名のチェックが false を返しました。鍵とトークンが対応していないか、署名後にトークンが変更されたかのどちらかです。`SignatureInvalidException` は `UnexpectedValueException` のサブクラスなので、汎用的な catch ブロックでは、パースエラーに紛れて見えなくなることがあります。

発生する理由

修正方法

  1. 1.

    鍵セット全体を渡し、kid による選択を php-jwt に任せる

    `JWT::decode` には、`kid` をキーとする `Key` オブジェクトの配列(`JWK::parseKeySet` で作成)か、ローテーション時に自動で更新もされる `CachedKeySet` を渡せます。

    php
    use Firebase\JWT\CachedKeySet;
    use Firebase\JWT\JWT;
    use GuzzleHttp\Client;
    use GuzzleHttp\Psr7\HttpFactory;
    
    // Keys selected by the token's kid, fetched from the issuer's JWKS and cached (PSR-6).
    $keys = new CachedKeySet(
        'https://issuer.example.com/.well-known/jwks.json',
        new Client(),
        new HttpFactory(),
        $cache,              // any PSR-6 cache pool
        3600,                // cache lifetime in seconds
        true                 // rate-limit refetches on unknown kids
    );
    $claims = JWT::decode($token, $keys);
  2. 2.

    公開鍵と秘密鍵を突き合わせる

    発行者の秘密鍵から導出した公開鍵が、設定した公開鍵と異なる場合、署名の検証は成功しません。

    bash
    # Do the issuer's private key and your public key belong together?
    openssl pkey -in issuer-private.pem -pubout | sha256sum
    openssl pkey -pubin -in configured-public.pem | sha256sum

関連するエラー

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