Mensagem de erro
Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
Também aparece como
- 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
Texto do JJWT 0.12+ (repare nos dois espaços antes de “Found”). O JJWT 0.11 e anteriores diziam “JWT strings must contain exactly 2 period characters. Found: N”. Uma entrada com espaços falha antes, com “Compact JWT strings may not contain whitespace.”
JJWT (Java) — io.jsonwebtoken.MalformedJwtException from JwtParser.parse*
O que significa
O JJWT contou os pontos na entrada e não encontrou nem os 2 de um token assinado (JWS) nem os 4 de um token criptografado (JWE). A string não é um JWT compacto, então nenhuma chave ou assinatura foi examinada. “Found: 0” normalmente indica um valor opaco, como um ID de sessão ou uma chave de API; uma reclamação sobre espaços em branco indica que o prefixo `Bearer` ou uma quebra de linha ainda está junto.
Por que acontece
O valor não é um JWT
comumTokens OAuth opacos, cookies de sessão, chaves de API, `"null"` ou um valor de cabeçalho vazio. Só strings de segmentos base64url separados por pontos são JWTs compactos.
O cabeçalho Authorization foi passado inteiro
comum`Bearer eyJ…` contém um espaço, que o JJWT rejeita antes de contar os pontos. Remova o esquema primeiro.
Falta parte do token
ocasionalUm token cortado em um ponto (truncamento de log, colunas com limite de tamanho, cópia manual) fica com um só ponto (“Found: 1”).
Como corrigir
- 1.
Extrair o token do cabeçalho corretamente
Aceite apenas `Bearer <token>` (sem diferenciar maiúsculas de minúsculas no esquema) e responda 401 a todo o resto.
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 deixar o framework extraí-lo
O suporte a servidor de recursos do Spring Security extrai e valida bearer tokens, incluindo as respostas de erro da 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(); }