Aller au contenu
ecdsa.com
golang-jwt/jwt (Go)Go

Message d’erreur

token is malformed: token contains an invalid number of segments

Également affiché sous la forme

  • token is malformed: could not base64 decode header: illegal base64 data at input byte 6
  • token contains an invalid number of segments

La v5 ajoute le préfixe « token is malformed: ». La v4 n’affiche que le texte interne, par exemple « token contains an invalid number of segments ». La position d’octet indiquée dans « illegal base64 data at input byte N » désigne le premier caractère invalide.

golang-jwt/jwt (Go) — jwt.ErrTokenMalformed

Ce que cela signifie

golang-jwt n’a même pas pu lire la structure du jeton. « invalid number of segments » signifie que la chaîne ne contient pas exactement deux points ; « could not base64 decode header » signifie que le premier segment n’est pas du base64url, le plus souvent parce que le préfixe `Bearer ` y est encore attaché (l’octet 6 est l’espace). En v5, ces erreurs sont enveloppées dans `jwt.ErrTokenMalformed` ; aucune clé n’a été recherchée.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Utiliser l’extracteur de requête

    `github.com/golang-jwt/jwt/v5/request` retire le schéma `Bearer` sans tenir compte de la casse et renvoie `request.ErrNoTokenInRequest` lorsqu’il n’y a aucun jeton.

    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.

    Valider la forme avant l’analyse

    Compter les points permet de distinguer un JWS (2), un JWE (4) et les chaînes inexploitables. Répondez 401 pour tout ce qui n’est pas un jeton que vous savez traiter.

    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
    }

Erreurs associées

Parcourir toute la base de données des erreurs de signature