Message d’erreur
The specified alg value is not allowed
Également affiché sous la forme
- jwt.exceptions.InvalidAlgorithmError: The specified alg value is not allowed
PyJWT (Python) — jwt.exceptions.InvalidAlgorithmError
Ce que cela signifie
La valeur `alg` de l’en-tête du jeton ne figure pas dans la liste `algorithms` que vous avez passée à `jwt.decode()`. PyJWT contrôle ce point avant de vérifier la signature, car l’en-tête est choisi par celui qui a produit le jeton et ne doit pas décider de la manière dont il est vérifié. Le jeton est peut-être correctement signé, mais avec un algorithme que vous n’avez pas autorisé.
Pourquoi cela se produit
L’émetteur a changé d’algorithme
fréquenteUne migration du fournisseur de RS256 vers ES256 (ou l’ajout d’une clé EdDSA) casse les vérificateurs qui figent l’ancienne valeur. Les échecs commencent exactement au moment du déploiement et ne touchent que les jetons nouvellement émis.
La JWK impose un autre algorithme
occasionnelleLorsque vous passez un `PyJWK` (par exemple issu de `PyJWKClient`), son `alg` restreint lui aussi la vérification. Une JWK étiquetée RS256 ne peut pas vérifier un jeton ES256.
Un jeton venu d’ailleurs
occasionnelleDes jetons d’un autre émetteur, un jeton HS256 interne envoyé à une API publique, ou une tentative de sondage avec `alg: "none"` ou `HS256` contre une API protégée par RSA. Dans ces cas, le rejet est correct.
Comment corriger l’erreur
- 1.
Lire d’abord l’en-tête
`jwt.get_unverified_header()` affiche `alg` et `kid` sans rien considérer comme fiable. Comparez cet en-tête à votre liste d’autorisation et aux clés que publie votre émetteur.
python print(jwt.get_unverified_header(token)) # {'alg': 'ES256', 'kid': '...', 'typ': 'JWT'} - 2.
Autoriser exactement l’algorithme de l’émetteur
Placez dans `algorithms` l’algorithme qu’utilise votre émetteur, et résolvez les clés à partir de son JWKS. Pendant une migration, listez les deux algorithmes, chacun associé à sa propre clé par `kid`.
python from jwt import PyJWKClient jwks = PyJWKClient("https://issuer.example.com/.well-known/jwks.json") signing_key = jwks.get_signing_key_from_jwt(token) claims = jwt.decode( token, signing_key.key, algorithms=["ES256"], # the algorithm(s) your issuer actually uses, never the token's own header audience="https://api.example.com", )