Mensagem de erro
Invalid crypto padding
Também aparece como
- Invalid header padding
- Invalid payload padding
- jwt.exceptions.DecodeError: Invalid crypto padding
A palavra antes de “padding” indica o segmento: `header`, `payload` ou `crypto` (a assinatura).
PyJWT (Python) — jwt.exceptions.DecodeError while base64url-decoding a segment
O que significa
O PyJWT dividiu o token em três segmentos, mas não conseguiu decodificar um deles em base64url. A expressão “crypto padding” se refere ao terceiro segmento (o da assinatura); “header padding” e “payload padding”, ao primeiro e ao segundo. Os segmentos de um JWS precisam usar o alfabeto base64 seguro para URLs (`A–Z a–z 0–9 - _`) sem o padding `=`; espaços, `+`, `/` ou um comprimento errado fazem a decodificação falhar antes de qualquer verificação de assinatura.
Por que acontece
O token ainda traz o prefixo Bearer
comumPassar `"Bearer eyJ…"` coloca um espaço e a palavra Bearer no segmento do cabeçalho, que então falha com “Invalid header padding”.
Quem gerou o token usou base64 padrão
comumSignatários escritos à mão que usam `base64.b64encode` em vez da variante segura para URLs, ou que mantêm o padding `=`, produzem segmentos com `+`, `/` ou `=`. Na maioria das vezes, isso atinge o segmento da assinatura e resulta em “Invalid crypto padding”.
O token passou por codificação ou decodificação de URL no caminho
ocasionalTokens passados em query strings ou em campos de formulário podem chegar com sequências `%2B`/`%3D` ou com o `+` transformado em espaço por um decodificador de formulários.
Caracteres foram adicionados ou perdidos ao copiar
ocasionalQuebras de linha vindas de um terminal, aspas vindas do JSON ou reticências inseridas por um visualizador de logs mudam o comprimento dos segmentos e o alfabeto usado.
Como corrigir
- 1.
Remover o esquema e validar o alfabeto
Aceite somente `Bearer <token>` em que o token corresponda ao padrão base64url de um JWS; responda 401 para todo o resto antes de chamar o 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 com base64url e sem padding
Se você mesmo monta os tokens, use base64 seguro para URLs e remova os `=` do final. Melhor ainda: deixe uma biblioteca JOSE montar o 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")