Fehlermeldung
The specified alg value is not allowed
Auch ausgegeben als
- jwt.exceptions.InvalidAlgorithmError: The specified alg value is not allowed
PyJWT (Python) — jwt.exceptions.InvalidAlgorithmError
Was der Fehler bedeutet
Der Parameter `alg` im Header des Tokens steht nicht in der Liste `algorithms`, die du an `jwt.decode()` übergeben hast. PyJWT prüft das vor der Signatur, weil der Header von demjenigen stammt, der das Token erzeugt hat, und deshalb nicht festlegen darf, wie es geprüft wird. Das Token kann korrekt signiert sein – nur eben mit einem Algorithmus, den du nicht erlaubt hast.
Warum der Fehler auftritt
Der Aussteller hat den Algorithmus gewechselt
häufigEine Migration des Providers von RS256 auf ES256 (oder ein zusätzlicher EdDSA-Schlüssel) lässt prüfende Dienste scheitern, die den alten Wert fest vorgeben. Die Fehler beginnen genau mit dem Rollout und betreffen nur neu ausgestellte Tokens.
Der JWK legt einen anderen Algorithmus fest
gelegentlichÜbergibst du einen `PyJWK` (etwa aus `PyJWKClient`), schränkt auch sein `alg` die Prüfung ein. Mit einem als RS256 gekennzeichneten JWK lässt sich kein ES256-Token prüfen.
Ein Token aus einer anderen Quelle
gelegentlichTokens eines anderen Ausstellers, ein internes HS256-Token, das an eine öffentliche API geschickt wird, oder ein Sondierungsversuch mit `alg: "none"` oder `HS256` gegen eine per RSA geschützte API. In diesen Fällen ist die Ablehnung korrekt.
So behebst du den Fehler
- 1.
Zuerst den Header lesen
`jwt.get_unverified_header()` zeigt `alg` und `kid`, ohne irgendetwas zu vertrauen. Vergleiche das mit deiner Allowlist und mit den Schlüsseln, die dein Aussteller veröffentlicht.
python print(jwt.get_unverified_header(token)) # {'alg': 'ES256', 'kid': '...', 'typ': 'JWT'} - 2.
Genau den Algorithmus des Ausstellers erlauben
Trage den Algorithmus, den dein Aussteller verwendet, in `algorithms` ein und beziehe die Schlüssel aus seinem JWKS. Liste während einer Migration beide Algorithmen auf, jeden über `kid` seinem eigenen Schlüssel zugeordnet.
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", )