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
Um token de acesso opaco, não um JWT
comumMuitos provedores OAuth emitem tokens de acesso opacos (`ya29.…` do Google, `gho_…` do GitHub). Eles foram feitos para ser validados pelo provedor, por introspecção ou pelo userinfo, e não para ser decodificados. Só o `id_token` do OpenID Connect tem garantia de ser um JWT.
A variável errada foi decodificada
comumUm ID de sessão, uma chave de API, `str(None)` ou o literal “undefined” vindo de um front-end. Registrar `repr(token)[:40]` no log antes da decodificação costuma encerrar a busca.
O token foi cortado
ocasionalUma coluna de banco de dados curta demais, um limite de tamanho de linha de log ou uma cópia manual interrompida antes do fim podem remover o último segmento e o ponto antes dele.
Como corrigir
- 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.
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)