Message d’erreur
Firebase\JWT\SignatureInvalidException: Signature verification failed
Également affiché sous la forme
- PHP Fatal error: Uncaught Firebase\JWT\SignatureInvalidException: Signature verification failed
Lorsque l’exception n’est pas interceptée, PHP affiche « PHP Fatal error: Uncaught Firebase\JWT\SignatureInvalidException: Signature verification failed in …/JWT.php ».
firebase/php-jwt (PHP) — Firebase\JWT\SignatureInvalidException from JWT::decode
Ce que cela signifie
php-jwt a analysé le jeton, accepté l’algorithme pour la clé que vous avez passée, et la vérification de la signature a renvoyé false : la clé et le jeton ne vont pas ensemble, ou le jeton a été modifié après la signature. `SignatureInvalidException` est une sous-classe de `UnexpectedValueException`, si bien qu’un bloc catch générique peut la masquer parmi les erreurs d’analyse.
Pourquoi cela se produit
La clé configurée n’est pas celle du signataire
fréquenteUne clé publique copiée depuis un autre environnement, ou une clé qui a fait l’objet d’une rotation côté émetteur. Firebase Auth et Google signent les jetons d’ID avec des clés qui changent à quelques jours d’intervalle.
Une clé prise dans un jeu de clés sans utiliser le kid
fréquenteLe code qui prend la première clé d’un JWKS (par exemple `reset(JWK::parseKeySet($jwks))`) fonctionne jusqu’à ce que l’émetteur signe avec une autre clé du jeu.
Le secret HMAC diffère d’un service à l’autre
occasionnellePour HS256, la moindre différence dans la chaîne du secret (espaces, saut de ligne final provenant d’un fichier, encodage base64 ou valeur brute) produit un MAC différent.
Le jeton a été modifié après la signature
occasionnelleEn-tête ou charge utile réencodés, ou jeton assemblé à partir de morceaux de deux jetons.
Comment corriger l’erreur
- 1.
Passer tout le jeu de clés et laisser php-jwt choisir selon le kid
`JWT::decode` accepte un tableau d’objets `Key` indexé par `kid` (issu de `JWK::parseKeySet`) ou un `CachedKeySet`, qui se met en outre à jour lors d’une rotation.
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.
Comparer les deux moitiés de la paire de clés
Si la clé publique dérivée de la clé privée de l’émetteur diffère de celle que vous avez configurée, la vérification de la signature ne peut pas réussir.
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