PyJWT encode et décode des JSON Web Tokens avec jwt.encode() et jwt.decode(), et récupère les clés de signature depuis un point de terminaison JWKS avec PyJWKClient. Les algorithmes asymétriques viennent de l’extra crypto, qui installe pyca/cryptography ; avec lui, la 2.15.1 a géré les familles HS, RS, PS et ES, ES256K et EdDSA, mais pas les noms plus récents Ed25519 et Ed448, qui ont levé NotImplementedError: Algorithm not supported.
Ses valeurs par défaut de vérification sont strictes. jwt.decode() sans algorithms échoue avec It is required that you pass in a value for the "algorithms" argument, un jeton non signé alg: none n’a jamais passé la vérification, pas même avec algorithms=["none"], et une clé publique PEM ou OpenSSH utilisée comme secret HS256 a été refusée avec InvalidKeyError. ES256 est lié à P-256 : la signature avec une clé P-384 a échoué sur une non-concordance de courbe.
Ce qui reste à votre charge : exp est facultatif, si bien qu’un jeton qui n’en a pas se décode indéfiniment, sauf si vous le listez sous require dans l’argument options, et leeway vaut zéro par défaut, de sorte que des serveurs décalés de quelques secondes divergent déjà sur l’expiration. Les secrets HMAC courts sont acceptés avec un simple InsecureKeyLengthWarning, facile à manquer dans les journaux : testez un secret avec le vérificateur de secrets JWT.
Les signatures ES256 sont sous la forme r‖s brute de 64 octets qu’exige JWS ; un jeton dont la signature a été assemblée en DER (par exemple à partir d’un appel de signature à un KMS) échoue avec le message générique Signature verification failed. Collez le jeton dans le débogueur JWT pour voir la longueur de la signature, et convertissez-la avec le convertisseur DER ⇄ brut.
L’exemple fixe l’algorithme, l’émetteur et l’audience, exige exp et tolère 30 secondes de décalage : les quatre paramètres qui permettent d’appeler jwt.decode() sans risque sur des jetons provenant d’un autre service.