Mensagem de erro
token is malformed: token contains an invalid number of segments
Também aparece como
- token is malformed: could not base64 decode header: illegal base64 data at input byte 6
- token contains an invalid number of segments
A v5 acrescenta o prefixo “token is malformed: ”. A v4 imprime só o texto interno, por exemplo, “token contains an invalid number of segments”. A posição do byte em “illegal base64 data at input byte N” aponta para o primeiro caractere inválido.
golang-jwt/jwt (Go) — jwt.ErrTokenMalformed
O que significa
O golang-jwt não conseguiu nem ler a estrutura do token. “invalid number of segments” significa que a string não tem exatamente dois pontos; “could not base64 decode header” significa que o primeiro segmento não está em base64url — o caso clássico é o prefixo `Bearer ` ainda estar junto (o byte 6 é o espaço). Na v5, esses erros vêm encapsulados em `jwt.ErrTokenMalformed`; nenhuma chave foi consultada.
Por que acontece
O cabeçalho Authorization foi analisado inteiro
comum`r.Header.Get("Authorization")` retorna `Bearer eyJ…`. Se esse valor for passado diretamente para `jwt.Parse`, o espaço torna o segmento do cabeçalho um base64 inválido.
O valor não é um JWT
comumTokens de acesso OAuth opacos, IDs de sessão, chaves de API ou um cabeçalho vazio chegam ao parser. Só strings com três segmentos base64url são tokens JWS.
Um token criptografado (JWE) com cinco segmentos
ocasionalAlguns provedores de identidade criptografam os tokens. O golang-jwt só trata tokens assinados; descriptografe primeiro o JWE (por exemplo, com o go-jose) e analise o JWS aninhado.
O token foi truncado
ocasionalUma coluna do banco de dados, o limite de tamanho de um cookie (4 KB) ou uma linha de log cortou o token, removendo o último segmento ou o último ponto.
Como corrigir
- 1.
Usar o extrator de requisição
O `github.com/golang-jwt/jwt/v5/request` remove o esquema `Bearer` sem diferenciar maiúsculas de minúsculas e retorna `request.ErrNoTokenInRequest` quando não há nenhum token.
go import "github.com/golang-jwt/jwt/v5/request" token, err := request.ParseFromRequest(r, request.OAuth2Extractor, keyfunc, request.WithParser(jwt.NewParser(jwt.WithValidMethods([]string{"ES256"})))) if err != nil { http.Error(w, "unauthorized", http.StatusUnauthorized) return } - 2.
Validar o formato antes de analisar
Contar os pontos distingue JWS (2), JWE (4) e lixo. Responda com 401 a tudo o que não for um token que você consiga processar.
go raw := strings.TrimSpace(strings.TrimPrefix(r.Header.Get("Authorization"), "Bearer ")) switch strings.Count(raw, ".") { case 2: // JWS: parse it case 4: // JWE: decrypt first (go-jose), golang-jwt does not handle encrypted tokens default: http.Error(w, "unauthorized", http.StatusUnauthorized) return }