Message d’erreur
It is required that you pass in a value for the "algorithms" argument when calling decode().
PyJWT (Python) — jwt.exceptions.DecodeError
Ce que cela signifie
Depuis PyJWT 2.0, jwt.decode() refuse de s’exécuter sans liste algorithms explicite. Ce n’est pas du pinaillage : déduire l’algorithme de l’en-tête du jeton lui-même rend possibles les attaques par confusion d’algorithme (par exemple, vérifier un jeton HS256 en utilisant une clé publique RSA comme secret HMAC). Le vérificateur, configuré côté serveur et hors de portée de l’attaquant, doit indiquer ce qu’il accepte, et PyJWT impose ce contrat au niveau de l’API, de sorte que la forme d’appel dangereuse est tout simplement impossible à écrire.
Pourquoi cela se produit
Du code écrit pour PyJWT 1.x
fréquentePyJWT 1.x acceptait jwt.decode(token, key) et devinait l’algorithme. La version 2.0 (2020) a rendu le paramètre algorithms obligatoire ; toute mise à jour de dépendance qui franchit cette limite fait apparaître cette erreur dans du code qui fonctionnait jusque-là.
Un tutoriel ou un extrait de code généré par un LLM l’a omis
fréquenteDe nombreux exemples anciens sur le web montrent encore des appels decode() à deux arguments. L’extrait fonctionne très bien dans les environnements figés sur PyJWT 1.x et échoue sur toute installation récente.
Une fonction utilitaire d’authentification partagée masque l’appel de décodage
occasionnelleLorsqu’un petit utilitaire interne enveloppe jwt.decode(), une mise à jour de PyJWT casse d’un coup tous les services qui importent cette fonction, et la trace d’appels (traceback) pointe vers la surcouche plutôt que vers le code appelant. Les intégrations aux frameworks (Flask-JWT-Extended, DRF SimpleJWT) passent algorithms en interne : ce sont les surcouches écrites à la main qui oublient habituellement ce paramètre.
Comment corriger l’erreur
- 1.
Indiquer l’algorithme explicitement
Passez exactement le ou les algorithmes qu’utilise votre émetteur (pour les jetons signés avec ECDSA, généralement ES256). Si plusieurs types de jetons transitent par un même service, donnez à chaque émetteur sa propre liste d’autorisation au lieu de les fusionner toutes en une seule liste permissive.
python import jwt payload = jwt.decode( token, public_key_pem, algorithms=["ES256"], # required — and a security control, not boilerplate audience="api://orders", ) - 2.
Pour une inspection sans vérification, le dire explicitement
Si vous avez seulement besoin de lire les claims (débogage, journalisation), désactivez la vérification délibérément, et n’utilisez jamais le résultat pour des décisions d’autorisation.
python claims = jwt.decode(token, options={"verify_signature": False}) # or just the header: header = jwt.get_unverified_header(token)