Message d’erreur
Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
Également affiché sous la forme
- 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
Libellé de JJWT 0.12+ (notez les deux espaces avant « Found »). JJWT 0.11 et les versions antérieures affichaient « JWT strings must contain exactly 2 period characters. Found: N ». Une entrée contenant des espaces échoue plus tôt avec « Compact JWT strings may not contain whitespace. »
JJWT (Java) — io.jsonwebtoken.MalformedJwtException from JwtParser.parse*
Ce que cela signifie
JJWT a compté les points dans l’entrée et n’a trouvé ni les 2 d’un jeton signé (JWS) ni les 4 d’un jeton chiffré (JWE). La chaîne n’est pas un JWT compact : aucune clé ni aucune signature n’a donc été examinée. « Found: 0 » désigne généralement une valeur opaque, comme un identifiant de session ou une clé d’API ; un message sur des espaces indique que le préfixe `Bearer` ou un saut de ligne est encore attaché.
Pourquoi cela se produit
La valeur n’est pas un JWT
fréquenteJetons OAuth opaques, cookies de session, clés d’API, `"null"` ou valeur d’en-tête vide. Seules les chaînes formées de segments base64url séparés par des points sont des JWT compacts.
L’en-tête Authorization a été transmis en entier
fréquente`Bearer eyJ…` contient un espace, que JJWT rejette avant de compter les points. Retirez d’abord le schéma.
Une partie du jeton manque
occasionnelleUn jeton coupé au niveau d’un point (troncature des journaux, colonnes de taille limitée, copie manuelle) ne contient plus qu’un point (« Found: 1 »).
Comment corriger l’erreur
- 1.
Extraire correctement le jeton de l’en-tête
N’acceptez que `Bearer <token>` (schéma insensible à la casse) et répondez 401 pour tout le reste.
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.
Ou laisser le framework l’extraire
La prise en charge du serveur de ressources de Spring Security extrait et valide les jetons porteurs, y compris les réponses d’erreur définies par la 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(); }