Mensaje de error
"kid" invalid, unable to lookup correct key
También se muestra como
- "kid" empty, unable to lookup correct key
Cuando se pasa un array de claves, los tokens sin `kid` en el encabezado provocan la excepción «"kid" empty, unable to lookup correct key».
firebase/php-jwt (PHP) — UnexpectedValueException from JWT::decode with a key array
Qué significa
Le pasas a `JWT::decode` un array de claves (normalmente obtenido de `JWK::parseKeySet`) y el array no tiene ninguna entrada para el `kid` del encabezado del token. php-jwt selecciona la clave estrictamente por `kid`; no prueba otras claves. El error relacionado «"kid" empty» significa que el token no tiene ningún `kid`, algo que un array de claves no puede resolver.
Por qué ocurre
El conjunto de claves en caché es anterior a una rotación
frecuenteLas aplicaciones que guardan el JWKS en un archivo, una base de datos o una caché de larga duración conservan los ID de clave antiguos después de que el proveedor rote las claves. Google y Firebase rotan sus claves de firma de tokens cada pocos días.
Conjunto de claves de otro emisor u otro proyecto
ocasionalUna URL de JWKS de otro inquilino, o los certificados OAuth de Google usados para tokens de ID de Firebase (Firebase usa una URL de claves distinta).
El emisor no define kid
ocasionalLos tokens sin `kid` solo pueden verificarse con un único objeto `Key`, no con un array de claves.
Cómo solucionarlo
- 1.
Usar CachedKeySet
Guarda el JWKS en caché mediante PSR-6 y lo vuelve a descargar cuando llega un `kid` desconocido, con un límite de frecuencia opcional para que valores `kid` aleatorios no puedan saturar al emisor.
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.
Pasar un único objeto Key para emisores sin kid
Si el emisor tiene exactamente una clave y omite `kid`, pasa esa clave directamente.
php // Issuer without kid and with exactly one key: pass a Key object, not an array. $claims = JWT::decode($token, new Key($publicKeyPem, 'ES256'));