python-jose implementiert JWS, JWE, JWK und JWT mit austauschbaren Backends – ecdsa in reinem Python, pycryptodome oder cryptography; für die Prüfung wurde das Extra cryptography installiert. Durch jahrelange FastAPI- und Flask-Tutorials ist die Bibliothek weit verbreitet, doch die Entwicklung ist langsam: 3.4.0 (Februar 2025) erschien fast vier Jahre nach 3.3.0, und neue Projekte wählen stattdessen meist PyJWT, jwcrypto oder joserfc.
algorithms ist in jwt.decode() optional, und ohne diese Angabe stammt der Algorithmus aus dem Header des Tokens. Zusammen mit dem Sicherheitshinweis GHSA-3qf3-8w2g-rqmx (CVE-2026-85394), veröffentlicht im September 2026 und in 3.5.0 nicht behoben, lässt sich das ausnutzen: Der Schutz davor, öffentliche Schlüssel als HMAC-Secrets zu verwenden, erkennt PEM- und OpenSSH-Text, aber nicht denselben Schlüssel als DER-Bytes. Die Prüfung reproduzierte das: Ein HS256-Token, dessen HMAC-Schlüssel der öffentliche Schlüssel in DER war, bestand die Prüfung gegen diesen Schlüssel, wenn algorithms fehlte, und wurde mit The specified alg value is not allowed abgelehnt, sobald algorithms=["ES256"] übergeben wurde. Übergib immer algorithms, verwende öffentliche Schlüssel als PEM-Strings und prüfe Secrets mit dem JWT-Secret-Checker.
Die Algorithmusauswahl ist die älteste unter den Python-Bibliotheken: nur die Familien HS, RS und ES. PS256, EdDSA und ES256K lösen Algorithm … not supported. aus, sodass sich Tokens von Anbietern, die auf Ed25519 oder RSA-PSS umgestiegen sind, nicht prüfen lassen. ES256 ist auch nicht an P-256 gebunden: Ein P-384-Schlüssel erzeugte unter einem Header ES256 eine 96-Byte-Signatur, die bei python-jose die Prüfung bestand, die andere Bibliotheken wie jose und PyJWT aber ablehnen.
ES256-Signaturen bestehen aus 64 Byte rohem r‖s, und eine DER-Signatur scheitert mit Signature verification failed.; der JWT-Debugger zeigt, welche Form ein Token enthält. exp ist optional und die Toleranz (Leeway) null, sofern du nicht require_exp und leeway in options setzt, wie es das Beispiel tut.
Unsignierte Tokens wurden mit Unable to find an algorithm for key abgelehnt, selbst mit algorithms=["none"].