Mensagem de erro
"kid" invalid, unable to lookup correct key
Também aparece como
- "kid" empty, unable to lookup correct key
A exceção “\"kid\" empty, unable to lookup correct key” é lançada para tokens sem o cabeçalho `kid` quando se passa um array de chaves.
firebase/php-jwt (PHP) — UnexpectedValueException from JWT::decode with a key array
O que significa
Você passou para `JWT::decode` um array de chaves (normalmente vindo de `JWK::parseKeySet`), e o array não tem nenhuma entrada para o `kid` do cabeçalho do token. O php-jwt seleciona a chave estritamente pelo `kid`; ele não tenta outras chaves. O erro parecido “\"kid\" empty” significa que o token não tem `kid` nenhum, o que um array de chaves não consegue resolver.
Por que acontece
O conjunto de chaves em cache é anterior a uma rotação
comumAplicações que guardam o JWKS em um arquivo, em um banco de dados ou em um cache de longa duração mantêm os IDs de chave antigos depois que o provedor faz a rotação. O Google e o Firebase trocam as chaves de assinatura dos tokens a cada poucos dias.
Conjunto de chaves de outro emissor ou projeto
ocasionalA URL do JWKS de outro tenant, ou os certificados OAuth do Google usados para tokens de ID do Firebase (o Firebase usa uma URL de chaves separada).
O emissor não define o kid
ocasionalTokens sem `kid` só podem ser verificados com um único objeto `Key`, e não com um array de chaves.
Como corrigir
- 1.
Usar CachedKeySet
Ele guarda o JWKS em cache via PSR-6 e o busca de novo quando chega um `kid` desconhecido, com limite de taxa opcional para que valores aleatórios de `kid` não sobrecarreguem o emissor.
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.
Passar uma única Key para emissores sem kid
Se o emissor tem exatamente uma chave e omite o `kid`, passe essa chave diretamente.
php // Issuer without kid and with exactly one key: pass a Key object, not an array. $claims = JWT::decode($token, new Key($publicKeyPem, 'ES256'));