Message d’erreur
Unable to find a signing key that matches: "2026-10"
Également affiché sous la forme
- jwt.exceptions.PyJWKClientError: Unable to find a signing key that matches: "2026-10"
- Unable to find a signing key that matches: "None"
La valeur entre guillemets est le `kid` du jeton ; `"None"` signifie que l’en-tête n’a pas de `kid`.
PyJWT (Python) — jwt.exceptions.PyJWKClientError from PyJWKClient.get_signing_key_from_jwt
Ce que cela signifie
`PyJWKClient` a récupéré le jeu de clés et n’y a trouvé aucune clé de signature dont le `kid` est égal au `kid` de l’en-tête du jeton (affiché entre guillemets). PyJWKClient actualise le jeu de clés une fois lorsqu’un `kid` est inconnu : la clé n’est donc réellement pas publiée à cette URL en ce moment. `"None"` entre guillemets signifie que le jeton n’a aucun `kid`.
Pourquoi cela se produit
Clé de signature mise en service avant d’être publiée
fréquenteSi l’émetteur signe avec une nouvelle clé avant de l’ajouter au JWKS (ou si un CDN sert une copie périmée du JWKS), les vérificateurs ne peuvent pas la trouver. Les émetteurs devraient d’abord publier la nouvelle clé, puis basculer dessus une fois les caches expirés.
Le client pointe vers le jeu de clés d’un autre émetteur
fréquenteLes URL de JWKS propres à chaque locataire (groupes d’utilisateurs Cognito, locataires Auth0, realms Keycloak, locataires Entra ID) se ressemblent. Une URL d’un autre environnement renvoie de vraies clés, mais pas celles de ce jeton.
L’en-tête du jeton n’a pas de kid
occasionnelle`PyJWKClient.get_signing_key_from_jwt` effectue la correspondance strictement par `kid`. Les jetons d’émetteurs qui l’omettent ne peuvent pas être résolus de cette façon ; vérifiez-les plutôt explicitement avec l’unique clé publiée.
La clé existe, mais n’est pas une clé de signature utilisable
occasionnellePyJWKClient ne prend en compte que les clés dont `use` est absent ou vaut `"sig"` et que PyJWT sait charger ; une clé d’un type non pris en charge est ignorée. Si le `kid` apparaît dans le JSON brut, mais pas dans `get_signing_keys()`, c’est pour cette raison.
Comment corriger l’erreur
- 1.
Comparer le kid du jeton aux clés chargées
`get_signing_keys(refresh=True)` montre exactement quelles clés PyJWKClient peut utiliser. Si le `kid` du jeton n’y figure pas, le problème vient de l’émetteur ou de l’URL, pas de votre 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.
Réutiliser un seul PyJWKClient
Créer le client à chaque requête désactive la mise en cache et sollicite l’émetteur à chaque appel. Un client de longue durée doté d’un cache de clés recharge malgré tout les clés dès qu’un nouveau `kid` apparaît.
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")