Quando vai comparar o token secret com o token que chega na Jws está chegando como null, eu não sei o que pode ser. Aí na classe service do token ele está dando sempre false.
public boolean isTokenValido(String token) {
try {
Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token);
return true;
}catch (Exception e) {
return false;
}
}
public String gerarToken(Authentication authentication) {
Usuario logado = (Usuario) authentication.getPrincipal(); //Esse authentication tem um método chamado getPrincipal para conseguirmos recuperar o usuário que está logado
Date hoje = new Date();
Date dataExpiration = new Date(hoje.getTime() + Long.parseLong(expiration)); //Eu estou somando os milisegundo da data hoje com e acrescentando mais os milisegundos da expiration;
return Jwts.builder()
.setIssuer("Api do Fórum da Alura") //Quem está fazendo a requisição;
.setSubject(logado.getId().toString())//quem é o dono desse token
.setIssuedAt(hoje)
.setExpiration(dataExpiration)
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
}
Na classe AuthenticacaoViaTokenFilter:
private String recuperarToken(HttpServletRequest request) {
//Nessa requição passo o nome que eu quero recuperar que é do postman.
String token = request.getHeader("Authorization");
if (token == null || token.isEmpty() || !token.startsWith("Bearer ")) {
return null;
}
//Pegar o token a partir do bearer, contamos 7 espaços na palavra bearer;
return token.substring(7, token.length());
}
Pra gerar o token:
@PostMapping
public ResponseEntity<TokenDto> autenticar(@RequestBody @Valid LoginForm form) {
UsernamePasswordAuthenticationToken dadosLogin = form.converter();
try{
Authentication authentication = authManager.authenticate(dadosLogin);
String token = (tokenService).gerarToken(authentication);
return ResponseEntity.ok(new TokenDto(token, "Bearer"));//Bearer é um dos mecanismos de autenticação utilizados no protocolo HTTP, tal como o Basic e o Digest.
} catch (AuthenticationException e) {
return ResponseEntity.badRequest().build();
}
}