Fehlermeldung
Unable to find a signing key that matches: "2026-10"
Auch ausgegeben als
- jwt.exceptions.PyJWKClientError: Unable to find a signing key that matches: "2026-10"
- Unable to find a signing key that matches: "None"
Der Wert in Anführungszeichen ist der `kid` des Tokens; `"None"` bedeutet, dass der Header keinen `kid` hat.
PyJWT (Python) — jwt.exceptions.PyJWKClientError from PyJWKClient.get_signing_key_from_jwt
Was der Fehler bedeutet
`PyJWKClient` hat den Schlüsselsatz abgerufen und keinen Signaturschlüssel gefunden, dessen `kid` dem `kid` im Header des Tokens entspricht (in Anführungszeichen angezeigt). PyJWKClient lädt den Schlüsselsatz bei einem unbekannten `kid` einmal neu, der Schlüssel ist unter dieser URL also derzeit tatsächlich nicht veröffentlicht. `"None"` in Anführungszeichen bedeutet, dass das Token überhaupt keinen `kid` hat.
Warum der Fehler auftritt
Signaturschlüssel rotiert, bevor er veröffentlicht war
häufigSigniert der Aussteller mit einem neuen Schlüssel, bevor er ihn ins JWKS aufgenommen hat (oder liefert ein CDN eine veraltete Kopie des JWKS aus), können prüfende Dienste ihn nicht finden. Aussteller sollten den neuen Schlüssel zuerst veröffentlichen und erst dann auf ihn umstellen, wenn die Caches abgelaufen sind.
Der Client zeigt auf den Schlüsselsatz eines anderen Ausstellers
häufigMandantenspezifische JWKS-URLs (Cognito-User-Pools, Auth0-Mandanten, Keycloak-Realms, Entra-ID-Mandanten) sehen einander ähnlich. Eine URL aus einer anderen Umgebung liefert echte Schlüssel – nur eben nicht den für dieses Token.
Der Header des Tokens hat keinen kid
gelegentlich`PyJWKClient.get_signing_key_from_jwt` ordnet streng nach `kid` zu. Tokens von Ausstellern, die ihn weglassen, lassen sich so nicht zuordnen; prüfe stattdessen explizit mit dem einzigen veröffentlichten Schlüssel.
Der Schlüssel existiert, ist aber kein verwendbarer Signaturschlüssel
gelegentlichPyJWKClient berücksichtigt nur Schlüssel, bei denen `use` fehlt oder `"sig"` ist und die sich mit PyJWT laden lassen; ein Schlüssel eines nicht unterstützten Typs wird übersprungen. Taucht der `kid` im rohen JSON auf, aber nicht in `get_signing_keys()`, liegt es daran.
So behebst du den Fehler
- 1.
kid des Tokens mit den geladenen Schlüsseln vergleichen
`get_signing_keys(refresh=True)` zeigt genau, welche Schlüssel PyJWKClient verwenden kann. Fehlt der `kid` des Tokens dort, liegt das Problem beim Aussteller oder bei der URL, nicht in deinem Code.
python print(jwt.get_unverified_header(token).get("kid")) for key in client.get_signing_keys(refresh=True): print(key.key_id, key.algorithm_name) - 2.
Einen PyJWKClient wiederverwenden
Erzeugst du den Client pro Anfrage, ist das Caching wirkungslos, und jeder Aufruf geht an den Aussteller. Ein langlebiger Client mit Schlüssel-Cache lädt trotzdem neu, sobald ein neuer `kid` auftaucht.
python from jwt import PyJWKClient # Module level: one client, cached keys, refetch on an unknown kid. JWKS = PyJWKClient("https://issuer.example.com/.well-known/jwks.json", cache_keys=True, lifespan=600) def verify(token: str) -> dict: signing_key = JWKS.get_signing_key_from_jwt(token) return jwt.decode(token, signing_key.key, algorithms=["ES256"], audience="https://api.example.com")