PyJWT kodiert und dekodiert JSON Web Tokens mit jwt.encode() und jwt.decode() und holt Signaturschlüssel mit PyJWKClient von einem JWKS-Endpunkt. Asymmetrische Algorithmen kommen über das Extra crypto, das pyca/cryptography mitinstalliert; damit beherrschte 2.15.1 die Familien HS, RS, PS und ES sowie ES256K und EdDSA, nicht aber die neueren Namen Ed25519 und Ed448, die NotImplementedError: Algorithm not supported auslösten.
Die Standardeinstellungen der Prüfung sind streng. jwt.decode() ohne algorithms scheitert mit It is required that you pass in a value for the "algorithms" argument, ein unsigniertes Token mit alg: none bestand die Prüfung nie – nicht einmal mit algorithms=["none"] –, und ein öffentlicher Schlüssel in PEM oder OpenSSH, als HS256-Secret verwendet, wurde mit InvalidKeyError abgelehnt. ES256 ist an P-256 gebunden: Das Signieren mit einem P-384-Schlüssel scheiterte, weil die Kurve nicht passte.
Was PyJWT dir überlässt: exp ist optional, sodass sich ein Token ohne diesen Claim für immer dekodieren lässt, sofern du ihn nicht im Argument options unter require aufführst, und leeway ist standardmäßig null, sodass Server, deren Uhren wenige Sekunden auseinanderliegen, schon uneins darüber sind, ob ein Token abgelaufen ist. Kurze HMAC-Secrets werden nur mit einer InsecureKeyLengthWarning akzeptiert, die in Logs leicht untergeht – teste ein Secret mit dem JWT-Secret-Checker.
ES256-Signaturen haben die 64 Byte lange rohe Form r‖s, die JWS verlangt; ein Token, dessen Signatur als DER zusammengesetzt wurde – etwa aus einem Signaturaufruf an ein KMS –, scheitert mit der allgemeinen Meldung Signature verification failed. Füge das Token in den JWT-Debugger ein, um die Länge der Signatur zu sehen, und konvertiere mit dem Konverter DER ⇄ Raw.
Das Beispiel legt Algorithmus, Aussteller und Audience fest, verlangt exp und lässt 30 Sekunden Uhrenabweichung zu – die vier Einstellungen, mit denen sich jwt.decode() gefahrlos auf Tokens eines anderen Dienstes anwenden lässt.