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
L’en-tête Authorization a été analysé en entier
fréquente`r.Header.Get("Authorization")` renvoie `Bearer eyJ…`. Si cette valeur est passée telle quelle à `jwt.Parse`, l’espace rend le segment d’en-tête invalide en base64.
La valeur n’est pas un JWT
fréquenteDes jetons d’accès OAuth opaques, des ID de session, des clés d’API ou un en-tête vide parviennent jusqu’à l’analyseur. Seules les chaînes composées de trois segments base64url sont des jetons JWS.
Un jeton chiffré (JWE) à cinq segments
occasionnelleCertains fournisseurs d’identité chiffrent les jetons. golang-jwt ne gère que les jetons signés : déchiffrez d’abord le JWE (par exemple avec go-jose), puis analysez le JWS imbriqué.
Le jeton a été tronqué
occasionnelleUne colonne de base de données, la limite de taille d’un cookie (4 Ko) ou une ligne de journal a coupé le jeton, en supprimant son dernier segment ou son dernier point.
Comment corriger l’erreur
- 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.
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 }