Fehlermeldung
Invalid crypto padding
Auch ausgegeben als
- Invalid header padding
- Invalid payload padding
- jwt.exceptions.DecodeError: Invalid crypto padding
Das Wort vor „padding“ nennt das Segment: `header`, `payload` oder `crypto` (die Signatur).
PyJWT (Python) — jwt.exceptions.DecodeError while base64url-decoding a segment
Was der Fehler bedeutet
PyJWT hat das Token in drei Segmente zerlegt, konnte eines davon aber nicht als base64url dekodieren. „crypto padding“ bezieht sich auf das dritte Segment (die Signatur), „header padding“ und „payload padding“ auf das erste und das zweite. JWS-Segmente müssen das URL-sichere base64-Alphabet (`A–Z a–z 0–9 - _`) ohne Padding mit `=` verwenden; Leerzeichen, `+`, `/` oder eine falsche Länge lassen die Dekodierung noch vor jeder Signaturprüfung scheitern.
Warum der Fehler auftritt
Das Präfix Bearer steht noch vor dem Token
häufigÜbergibst du `"Bearer eyJ…"`, landen ein Leerzeichen und das Wort Bearer im Header-Segment, und PyJWT lehnt es dann mit „Invalid header padding“ ab.
Der Erzeuger des Tokens verwendet Standard-base64
häufigSelbst geschriebene Signierer, die `base64.b64encode` statt der URL-sicheren Variante verwenden oder das Padding mit `=` beibehalten, erzeugen Segmente mit `+`, `/` oder `=`. Meist ist davon das Signatursegment betroffen; die Folge ist „Invalid crypto padding“.
Das Token wurde unterwegs URL-kodiert oder -dekodiert
gelegentlichTokens, die in Query-Strings oder Formularfeldern übergeben werden, können mit den Sequenzen `%2B`/`%3D` ankommen oder mit einem `+`, das ein Formular-Decoder in ein Leerzeichen verwandelt hat.
Beim Kopieren kamen Zeichen hinzu oder gingen verloren
gelegentlichZeilenumbrüche aus einem Terminal, Anführungszeichen aus JSON oder Auslassungspunkte, die ein Log-Viewer einfügt, verändern Länge und Alphabet der Segmente.
So behebst du den Fehler
- 1.
Schema entfernen und Alphabet prüfen
Akzeptiere nur `Bearer <token>`, wenn das Token dem base64url-Muster eines JWS entspricht; beantworte alles andere mit 401, noch bevor du PyJWT aufrufst.
python import re BASE64URL_JWS = re.compile(r"^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$") def extract(authorization: str) -> str: scheme, _, token = authorization.partition(" ") token = token.strip() if scheme.lower() != "bearer" or not BASE64URL_JWS.match(token): raise ValueError("not a compact JWS") return token - 2.
Mit base64url ohne Padding kodieren
Wenn du Tokens selbst baust, verwende URL-sicheres base64 und entferne abschließende `=`. Besser: Lass eine JOSE-Bibliothek das Token zusammensetzen.
python import base64 def b64url(data: bytes) -> str: # JWS uses base64url WITHOUT padding (RFC 7515 section 2). return base64.urlsafe_b64encode(data).rstrip(b"=").decode("ascii")