Pular para o conteúdo
ecdsa.com
golang-jwt/jwt (Go)Go

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

Como corrigir

  1. 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. 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
    }

Erros relacionados

Ver toda a base de erros de assinatura