Aller au contenu
ecdsa.com
PyJWT (Python)JWKS et découverte des clés

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

Comment corriger l’erreur

  1. 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. 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")

Erreurs associées

Parcourir toute la base de données des erreurs de signature