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

Mensagem de erro

Not enough segments

Também aparece como

  • jwt.exceptions.DecodeError: Not enough segments

PyJWT (Python) — jwt.exceptions.DecodeError

O que significa

O PyJWT não conseguiu dividir a entrada em `header.payload.signature`: ela contém menos de dois pontos. A string não é um JWS compacto, então nenhuma chave nem algoritmo chegou a ser consultado. O valor que chega a `jwt.decode()` é outra coisa que não um JWT — ou um JWT que perdeu o final no caminho.

Por que acontece

Como corrigir

  1. 1.

    Verificar o formato antes da decodificação

    Um JWS compacto tem exatamente dois pontos. Rejeite qualquer outra coisa com 401 na borda da sua API, para que uma entrada malformada nunca chegue ao decodificador.

    python
    def bearer_token(headers: dict) -> str | None:
        scheme, _, token = headers.get("Authorization", "").partition(" ")
        if scheme.lower() != "bearer" or token.count(".") != 2:
            return None  # not a compact JWS: answer 401 instead of decoding
        return token
  2. 2.

    Validar tokens opacos com o emissor

    Se o provedor emite tokens de acesso opacos, chame o endpoint de introspecção de token dele (RFC 7662) ou configure o provedor para emitir tokens de acesso JWT para sua API (muitas vezes, solicitando um público-alvo).

    python
    import requests
    
    # Opaque tokens are validated by the authorization server (RFC 7662), not by decoding them.
    resp = requests.post(
        "https://issuer.example.com/oauth2/introspect",
        data={"token": token},
        auth=(CLIENT_ID, CLIENT_SECRET),
        timeout=5,
    )
    active = resp.json().get("active", False)

Erros relacionados

Ver toda a base de erros de assinatura