Pular para o conteúdo
ecdsa.com
PyJWT (Python)Bibliotecas de JWT

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

Como corrigir

  1. 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. 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")

Erros relacionados

Ver toda a base de erros de assinatura