Message d’erreur
"kid" invalid, unable to lookup correct key
Également affiché sous la forme
- "kid" empty, unable to lookup correct key
L’exception « \"kid\" empty, unable to lookup correct key » est levée pour les jetons sans en-tête `kid` lorsqu’un tableau de clés est passé.
firebase/php-jwt (PHP) — UnexpectedValueException from JWT::decode with a key array
Ce que cela signifie
Vous avez passé à `JWT::decode` un tableau de clés (généralement issu de `JWK::parseKeySet`), et ce tableau n’a aucune entrée pour le `kid` de l’en-tête du jeton. php-jwt sélectionne la clé strictement par `kid` ; il n’essaie pas d’autres clés. Le message voisin « \"kid\" empty » signifie que le jeton n’a pas de `kid` du tout, ce qu’un tableau de clés ne peut pas résoudre.
Pourquoi cela se produit
Le jeu de clés en cache est antérieur à une rotation
fréquenteLes applications qui stockent le JWKS dans un fichier, une base de données ou un cache de longue durée conservent les anciens identifiants de clé après une rotation chez le fournisseur. Google et Firebase effectuent une rotation de leurs clés de signature de jetons à quelques jours d’intervalle.
Jeu de clés d’un autre émetteur ou d’un autre projet
occasionnelleL’URL JWKS d’un autre locataire, ou les certificats OAuth de Google utilisés pour des jetons d’ID Firebase (Firebase utilise une URL de clés distincte).
L’émetteur ne définit pas de kid
occasionnelleLes jetons sans `kid` ne peuvent être vérifiés qu’avec un unique objet `Key`, pas avec un tableau de clés.
Comment corriger l’erreur
- 1.
Utiliser CachedKeySet
Cette classe met le JWKS en cache via PSR-6 et le récupère de nouveau lorsqu’un `kid` inconnu arrive, avec une limitation de débit facultative pour que des valeurs de `kid` aléatoires ne puissent pas submerger l’émetteur de requêtes.
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.
Passer un seul objet Key pour les émetteurs sans kid
Si l’émetteur n’a qu’une seule clé et omet `kid`, passez directement cette clé.
php // Issuer without kid and with exactly one key: pass a Key object, not an array. $claims = JWT::decode($token, new Key($publicKeyPem, 'ES256'));