Fehlermeldung
token is malformed: token contains an invalid number of segments
Auch ausgegeben als
- token is malformed: could not base64 decode header: illegal base64 data at input byte 6
- token contains an invalid number of segments
v5 stellt „token is malformed: “ voran. v4 gibt nur den inneren Text aus, etwa „token contains an invalid number of segments“. Der Byte-Offset in „illegal base64 data at input byte N“ zeigt auf das erste ungültige Zeichen.
golang-jwt/jwt (Go) — jwt.ErrTokenMalformed
Was der Fehler bedeutet
golang-jwt konnte nicht einmal die Struktur des Tokens lesen. „invalid number of segments“ bedeutet, dass der String nicht genau zwei Punkte enthält; „could not base64 decode header“ bedeutet, dass das erste Segment kein base64url ist – klassischerweise, weil noch das Präfix `Bearer ` davorhängt (Byte 6 ist das Leerzeichen). In v5 sind diese Fehler in `jwt.ErrTokenMalformed` verpackt; es wurde kein Schlüssel nachgeschlagen.
Warum der Fehler auftritt
Der Header Authorization wurde als Ganzes geparst
häufig`r.Header.Get("Authorization")` gibt `Bearer eyJ…` zurück. Wird dieser Wert direkt an `jwt.Parse` übergeben, ist das Header-Segment wegen des Leerzeichens kein gültiges base64.
Der Wert ist kein JWT
häufigOpake Access Tokens von OAuth, Session-IDs, API-Schlüssel oder ein leerer Header landen im Parser. Nur Strings mit drei base64url-Segmenten sind JWS-Tokens.
Ein verschlüsseltes Token (JWE) mit fünf Segmenten
gelegentlichManche Identity Provider verschlüsseln Tokens. golang-jwt verarbeitet nur signierte Tokens; entschlüssele zuerst das JWE (zum Beispiel mit go-jose) und parse dann das darin verschachtelte JWS.
Das Token wurde abgeschnitten
gelegentlichEine Datenbankspalte, die Größenbegrenzung für Cookies (4 KB) oder eine Logzeile hat das Token abgeschnitten, sodass das letzte Segment oder der letzte Punkt fehlt.
So behebst du den Fehler
- 1.
Den Extractor für Anfragen verwenden
`github.com/golang-jwt/jwt/v5/request` entfernt das Schema `Bearer` ohne Rücksicht auf Groß- und Kleinschreibung und gibt `request.ErrNoTokenInRequest` zurück, wenn überhaupt kein Token vorhanden ist.
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.
Form vor dem Parsen prüfen
Das Zählen der Punkte unterscheidet JWS (2), JWE (4) und Datenmüll. Antworte mit 401 auf alles, was kein Token ist, das du verarbeiten kannst.
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 }