Message d’erreur
Invalid crypto padding
Également affiché sous la forme
- Invalid header padding
- Invalid payload padding
- jwt.exceptions.DecodeError: Invalid crypto padding
Le mot placé avant « padding » désigne le segment : `header`, `payload` ou `crypto` (la signature).
PyJWT (Python) — jwt.exceptions.DecodeError while base64url-decoding a segment
Ce que cela signifie
PyJWT a découpé le jeton en trois segments, mais n’a pas pu décoder l’un d’eux en base64url. « crypto padding » désigne le troisième segment (la signature), « header padding » et « payload padding » le premier et le deuxième. Les segments JWS doivent utiliser l’alphabet base64 adapté aux URL (`A–Z a–z 0–9 - _`) sans remplissage `=` ; des espaces, `+`, `/` ou une longueur incorrecte font échouer le décodage avant toute vérification de signature.
Pourquoi cela se produit
Le préfixe Bearer est toujours présent
fréquentePasser `"Bearer eyJ…"` place un espace et le mot Bearer dans le segment d’en-tête, qui échoue alors avec le message « Invalid header padding ».
Le producteur du jeton a utilisé le base64 standard
fréquenteLes signataires écrits à la main qui utilisent `base64.b64encode` au lieu de la variante adaptée aux URL, ou qui conservent le remplissage `=`, produisent des segments contenant `+`, `/` ou `=`. Le plus souvent, cela touche le segment de signature, d’où le message « Invalid crypto padding ».
Le jeton a subi un encodage ou un décodage URL en chemin
occasionnelleLes jetons passés dans des chaînes de requête ou des champs de formulaire peuvent arriver avec des séquences `%2B`/`%3D`, ou avec des `+` transformés en espaces par un décodeur de formulaire.
Des caractères ont été ajoutés ou perdus lors d’une copie
occasionnelleDes retours à la ligne venus d’un terminal, des guillemets venus du JSON ou des points de suspension insérés par un visualiseur de journaux modifient la longueur des segments et leur alphabet.
Comment corriger l’erreur
- 1.
Retirer le schéma et valider l’alphabet
N’acceptez que `Bearer <token>` avec un jeton conforme au motif JWS en base64url ; renvoyez 401 pour tout le reste avant d’appeler PyJWT.
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.
Encoder en base64url sans remplissage
Si vous construisez vous-même les jetons, utilisez le base64 adapté aux URL et supprimez les `=` finaux. Mieux encore : laissez une bibliothèque JOSE assembler le jeton.
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")