Pular para o conteúdo
ecdsa.com
JJWT (Java)Java

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

Como corrigir

  1. 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. 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();
    }

Erros relacionados

Ver toda a base de erros de assinatura