Сообщение об ошибке
"kid" invalid, unable to lookup correct key
Также выводится как
- "kid" empty, unable to lookup correct key
Исключение «\"kid\" empty, unable to lookup correct key» выбрасывается для токенов без заголовка `kid`, если передан массив ключей.
firebase/php-jwt (PHP) — UnexpectedValueException from JWT::decode with a key array
Что это означает
Вы передали в `JWT::decode` массив ключей (обычно из `JWK::parseKeySet`), но в массиве нет записи для `kid` из заголовка токена. php-jwt выбирает ключ строго по `kid` и другие ключи не пробует. Родственная ошибка «\"kid\" empty» означает, что в токене вообще нет `kid`, а без него ключ из массива выбрать невозможно.
Почему это происходит
Набор ключей в кеше получен до ротации
частоПриложения, которые хранят JWKS в файле, базе данных или долгоживущем кеше, после ротации ключей у провайдера по-прежнему знают только старые идентификаторы ключей. Google и Firebase меняют ключи подписи токенов каждые несколько дней.
Набор ключей другого издателя или проекта
иногдаURL JWKS другого тенанта или сертификаты OAuth от Google, которые используют для ID-токенов Firebase (у Firebase отдельный URL ключей).
Издатель не указывает kid
иногдаТокены без `kid` можно проверить только одним объектом `Key`, а не массивом ключей.
Как исправить
- 1.
Используйте CachedKeySet
Этот класс кеширует JWKS через PSR-6 и запрашивает набор заново, когда приходит неизвестный `kid`; необязательное ограничение частоты запросов не даёт случайным значениям `kid` заваливать издателя запросами.
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.
Передавайте один Key для издателей без kid
Если издатель использует ровно один ключ и не указывает `kid`, передайте этот ключ напрямую.
php // Issuer without kid and with exactly one key: pass a Key object, not an array. $claims = JWT::decode($token, new Key($publicKeyPem, 'ES256'));