Mensaje de error
Invalid crypto padding
También se muestra como
- Invalid header padding
- Invalid payload padding
- jwt.exceptions.DecodeError: Invalid crypto padding
La palabra que precede a «padding» indica el segmento: `header`, `payload` o `crypto` (la firma).
PyJWT (Python) — jwt.exceptions.DecodeError while base64url-decoding a segment
Qué significa
PyJWT dividió el token en tres segmentos, pero no pudo decodificar en base64url uno de ellos. La expresión «crypto padding» se refiere al tercer segmento (el de la firma), y «header padding» y «payload padding», al primero y al segundo. Los segmentos JWS deben usar el alfabeto base64 seguro para URL (`A–Z a–z 0–9 - _`) sin relleno `=`; los espacios, `+`, `/` o una longitud incorrecta hacen que la decodificación falle antes de cualquier comprobación de la firma.
Por qué ocurre
El prefijo Bearer sigue pegado al token
frecuentePasar `"Bearer eyJ…"` introduce un espacio y la palabra Bearer en el segmento del encabezado, que entonces falla con «Invalid header padding».
Quien generó el token usó base64 estándar
frecuenteLos firmantes escritos a mano que usan `base64.b64encode` en lugar de la variante segura para URL, o que conservan el relleno `=`, producen segmentos con `+`, `/` o `=`. Lo más habitual es que afecte al segmento de la firma, y entonces aparece «Invalid crypto padding».
El token sufrió una codificación o decodificación URL por el camino
ocasionalLos tokens que se pasan en cadenas de consulta o en campos de formulario pueden llegar con secuencias `%2B`/`%3D`, o con `+` convertido en un espacio por un decodificador de formularios.
Se añadieron o se perdieron caracteres al copiar
ocasionalLos saltos de línea copiados de una terminal, las comillas de JSON o los puntos suspensivos que inserta un visor de registros cambian la longitud y el alfabeto de los segmentos.
Cómo solucionarlo
- 1.
Quitar el esquema y validar el alfabeto
Acepta solo `Bearer <token>` cuando el token coincida con el patrón JWS en base64url; responde 401 a todo lo demás antes de llamar a 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.
Codificar con base64url y sin relleno
Si construyes los tokens tú mismo, usa base64 seguro para URL y elimina los `=` finales. Mejor aún: deja que una biblioteca JOSE ensamble el token.
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")