Fehlermeldung
It is required that you pass in a value for the "algorithms" argument when calling decode().
PyJWT (Python) — jwt.exceptions.DecodeError
Was der Fehler bedeutet
Seit PyJWT 2.0 verweigert jwt.decode() die Ausführung ohne explizite Liste algorithms. Das ist keine Pedanterie: Den Algorithmus aus dem Header des Tokens selbst abzuleiten, ermöglicht Algorithm-Confusion-Angriffe (etwa die Prüfung eines HS256-Tokens mit einem öffentlichen RSA-Schlüssel als HMAC-Secret). Die prüfende Seite – serverseitig konfiguriert, außerhalb der Reichweite eines Angreifers – muss festlegen, was sie akzeptiert, und PyJWT erzwingt diesen Vertrag auf API-Ebene, sodass sich der unsichere Aufruf schlicht nicht schreiben lässt.
Warum der Fehler auftritt
Für PyJWT 1.x geschriebener Code
häufigPyJWT 1.x erlaubte jwt.decode(token, key) und erriet den Algorithmus. Mit dem Release 2.0 (2020) wurde algorithms zur Pflicht; jedes Update der Abhängigkeit über diese Grenze hinweg lässt diesen Fehler in bisher funktionierendem Code auftreten.
Ein Tutorial oder ein von einem LLM erzeugtes Snippet lässt algorithms weg
häufigViele ältere Beispiele im Netz zeigen noch Aufrufe von decode() mit zwei Argumenten. Das Snippet läuft in Umgebungen, die auf PyJWT 1.x festgelegt sind, einwandfrei und scheitert bei jeder aktuellen Installation.
Eine gemeinsam genutzte Auth-Hilfsfunktion verbirgt den Aufruf von decode
gelegentlichKapselt eine kleine interne Hilfsfunktion jwt.decode(), legt ein PyJWT-Upgrade jeden Dienst, der sie importiert, auf einen Schlag lahm, und der Traceback zeigt auf den Wrapper statt auf den aufrufenden Code. Framework-Integrationen (Flask-JWT-Extended, DRF SimpleJWT) übergeben algorithms intern – selbst geschriebene Wrapper sind die übliche Stelle, an der der Parameter fehlt.
So behebst du den Fehler
- 1.
Algorithmus explizit angeben
Übergib genau den oder die Algorithmen, die dein Aussteller verwendet – bei mit ECDSA signierten Tokens typischerweise ES256. Laufen mehrere Arten von Tokens durch einen Dienst, gib jedem Aussteller seine eigene Allowlist, statt alle zu einer großzügigen Liste zusammenzuführen.
python import jwt payload = jwt.decode( token, public_key_pem, algorithms=["ES256"], # required — and a security control, not boilerplate audience="api://orders", ) - 2.
Untersuchung ohne Prüfung ausdrücklich anfordern
Musst du nur Claims lesen (Debugging, Logging), schalte die Prüfung bewusst ab – und lass das Ergebnis niemals in Autorisierungsentscheidungen einfließen.
python claims = jwt.decode(token, options={"verify_signature": False}) # or just the header: header = jwt.get_unverified_header(token)