Fehlermeldung
Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
Auch ausgegeben als
- io.jsonwebtoken.MalformedJwtException: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 1
- io.jsonwebtoken.MalformedJwtException: Compact JWT strings may not contain whitespace.
- io.jsonwebtoken.MalformedJwtException: JWT strings must contain exactly 2 period characters. Found: 0
Wortlaut von JJWT 0.12+ (beachte die zwei Leerzeichen vor „Found“). JJWT 0.11 und älter meldeten „JWT strings must contain exactly 2 period characters. Found: N“. Eine Eingabe mit Leerzeichen scheitert schon vorher mit „Compact JWT strings may not contain whitespace.“
JJWT (Java) — io.jsonwebtoken.MalformedJwtException from JwtParser.parse*
Was der Fehler bedeutet
JJWT hat die Punkte in der Eingabe gezählt und weder die 2 eines signierten Tokens (JWS) noch die 4 eines verschlüsselten (JWE) gefunden. Der String ist kein kompaktes JWT, also wurden weder Schlüssel noch Signatur angesehen. „Found: 0“ steht typischerweise für einen opaken Wert wie eine Session-ID oder einen API-Schlüssel; eine Meldung über Whitespace bedeutet, dass das Präfix `Bearer` oder ein Zeilenumbruch noch daranhängt.
Warum der Fehler auftritt
Der Wert ist kein JWT
häufigOpake OAuth-Tokens, Session-Cookies, API-Schlüssel, `"null"` oder ein leerer Header-Wert. Nur Strings aus base64url-Segmenten, die durch Punkte getrennt sind, sind kompakte JWTs.
Der Header Authorization wurde komplett übergeben
häufig`Bearer eyJ…` enthält ein Leerzeichen, das JJWT schon vor dem Zählen der Punkte ablehnt. Entferne zuerst das Authentifizierungsschema.
Ein Teil des Tokens fehlt
gelegentlichEin an einem Punkt abgeschnittenes Token (gekürzte Logs, Spalten mit Größenlimit, manuelles Kopieren) behält nur einen Punkt („Found: 1“).
So behebst du den Fehler
- 1.
Token korrekt aus dem Header extrahieren
Akzeptiere nur `Bearer <token>` (Schema ohne Beachtung der Groß- und Kleinschreibung) und antworte auf alles andere mit 401.
java static String bearerToken(String authorizationHeader) { if (authorizationHeader == null) return null; String[] parts = authorizationHeader.trim().split("\\s+", 2); if (parts.length != 2 || !parts[0].equalsIgnoreCase("Bearer")) return null; return parts[1]; } - 2.
Oder das Framework extrahieren lassen
Die Unterstützung für Ressourcenserver in Spring Security extrahiert und validiert Bearer Tokens, einschließlich der Fehlerantworten nach RFC 6750.
java // Spring Security resource server: the BearerTokenAuthenticationFilter extracts the token for you. @Bean SecurityFilterChain api(HttpSecurity http) throws Exception { return http .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) .oauth2ResourceServer(oauth -> oauth.jwt(Customizer.withDefaults())) .build(); }