Fehlermeldung
"kid" invalid, unable to lookup correct key
Auch ausgegeben als
- "kid" empty, unable to lookup correct key
„\"kid\" empty, unable to lookup correct key“ wird bei Tokens ohne Header `kid` geworfen, wenn ein Schlüssel-Array übergeben wird.
firebase/php-jwt (PHP) — UnexpectedValueException from JWT::decode with a key array
Was der Fehler bedeutet
Du hast `JWT::decode` ein Array von Schlüsseln übergeben (typischerweise aus `JWK::parseKeySet`), und das Array hat keinen Eintrag für den `kid` im Header des Tokens. php-jwt wählt den Schlüssel streng nach `kid` aus und probiert keine anderen Schlüssel. Die verwandte Meldung „\"kid\" empty“ bedeutet, dass das Token überhaupt keinen `kid` hat, was sich mit einem Schlüssel-Array nicht auflösen lässt.
Warum der Fehler auftritt
Der zwischengespeicherte Schlüsselsatz ist älter als eine Rotation
häufigAnwendungen, die das JWKS in einer Datei, einer Datenbank oder einem langlebigen Cache speichern, behalten nach einer Rotation beim Provider die alten Schlüssel-IDs. Google und Firebase rotieren ihre Signaturschlüssel für Tokens alle paar Tage.
Schlüsselsatz eines anderen Ausstellers oder Projekts
gelegentlichEine JWKS-URL eines anderen Mandanten oder die OAuth-Zertifikate von Google, verwendet für Firebase-ID-Tokens (Firebase nutzt eine eigene Schlüssel-URL).
Der Aussteller setzt keinen kid
gelegentlichTokens ohne `kid` lassen sich nur mit einem einzelnen Objekt `Key` prüfen, nicht mit einem Schlüssel-Array.
So behebst du den Fehler
- 1.
CachedKeySet verwenden
CachedKeySet speichert das JWKS über PSR-6 zwischen und ruft es erneut ab, wenn ein unbekannter `kid` ankommt – optional mit Rate Limiting, damit zufällige Werte für `kid` den Aussteller nicht mit Anfragen überfluten.
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.
Bei Ausstellern ohne kid einen einzelnen Key übergeben
Hat der Aussteller genau einen Schlüssel und lässt `kid` weg, übergib diesen Schlüssel direkt.
php // Issuer without kid and with exactly one key: pass a Key object, not an array. $claims = JWT::decode($token, new Key($publicKeyPem, 'ES256'));