Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Problemas com o Token

io.jsonwebtoken.MalformedJwtException: JWT strings must contain exactly 2 period characters. Found: 4
    at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:235)
    at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:481)
    at io.jsonwebtoken.impl.DefaultJwtParser.parseClaimsJws(DefaultJwtParser.java:541)
    at br.com.alura.aluraflix.config.security.TokenService.isTokenValid(TokenService.java:38)
    at br.com.alura.aluraflix.config.security.AuthenticationByTokenFilter.doFilterInternal(AuthenticationByTokenFilter.java:29)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)

Estou recebenco essa exception,

//Filtro chamado uma única vez a cada requisição
public class AuthenticationByTokenFilter extends OncePerRequestFilter {

    //não é possível fazer injeção de dependências aqui
    private TokenService tokenService;

    public AuthenticationByTokenFilter(TokenService tokenService) {
        this.tokenService = tokenService;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        String token = recuperateToken(request);

        boolean valid = tokenService.isTokenValid(token);
        System.out.println(valid);
        filterChain.doFilter(request, response);
    }

    private String recuperateToken(HttpServletRequest request) {
        String token = request.getHeader(HttpHeaders.AUTHORIZATION);

        if(token == null || token.isEmpty() || !token.startsWith("Bearer ")){
            return null;
        }
        return token.substring(7, token.length());
    }
}
@Service
public class TokenService {

    //@Value serve para injetar parâmetros do application.properties
    @Value("${aluraflix.jwt.expiration}")
    private String expiration;

    @Value("${aluraflix.jwt.secret}")
    private String secret;

    public String generateToken(Authentication authentication) {
        User tokenOwner = (User) authentication.getPrincipal();
        Date today = new Date();
        Date dataExpiration = new Date(today.getTime() + Long.parseLong(expiration));
        return Jwts.builder()
                .setIssuer("AluraFlix API")
                .setSubject(tokenOwner.getId().toString())
                //data de geração de token
                .setIssuedAt(today)
                .setExpiration(dataExpiration)
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();
    }

    public boolean isTokenValid(String token) {
        try{
            Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
2 respostas
solução!

Oi Irene,

Os códigos estão certinhos.

Qual o token que você enviou na requisição pelo Postman?

Poxa, me enrolei na hora de passar o token lá no postman. Valeu, Rodrigo!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software