Meu Token expirou, e todas as requisições me retorna o erro com a mensagem "Token JWT inválido ou expirado!" como posso resolver ? Criei um outro usuário, mas quando fui fazer um login com ele pra poder gerar o token, o projeto exigiu um token.
Meu Token expirou, e todas as requisições me retorna o erro com a mensagem "Token JWT inválido ou expirado!" como posso resolver ? Criei um outro usuário, mas quando fui fazer um login com ele pra poder gerar o token, o projeto exigiu um token.
Oi William!
Se o token expirar você precisa apenas disparar novamente a requisição de efetuar login, para gerar um novo token.
Boa tarde, Rodrigo. Continua dando o mesmo problema, quando tento fazer o login não está gerando um novo token
@Service
public class TokenService {
@Value("${api.security.token.secret}")
private String secret;
public String gerarToken(Usuario usuario) {
try {
var algoritmo = Algorithm.HMAC256(secret);
return JWT.create()
.withIssuer("API Voll.med")
.withSubject(usuario.getLogin())
.withExpiresAt(dataExpiracao())
.sign(algoritmo);
} catch (JWTCreationException exception){
throw new RuntimeException("Erro ao gerar token JWT", exception);
}
}
public String getSubject(String tokenJWT) {
try {
var algoritmo = Algorithm.HMAC256(secret);
return JWT.require(algoritmo)
.withIssuer("API Voll.med")
.build()
.verify(tokenJWT)
.getSubject();
} catch (JWTVerificationException exception){
throw new RuntimeException("Token JWT inválido ou expirado!");
}
}
private Instant dataExpiracao() {
return LocalDateTime.now().plusHours(2).toInstant(ZoneOffset.of("-03:00"));
}
}
@Component
public class SecurityFilter extends OncePerRequestFilter {
@Autowired
private TokenService tokenService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
var tokenJWT = recuperarToken(request);
var subject = tokenService.getSubject(tokenJWT);
System.out.println(subject);
filterChain.doFilter(request, response);
}
private String recuperarToken(HttpServletRequest request) {
var authorizationHeader = request.getHeader("Authorization");
if (authorizationHeader == null) {
throw new RuntimeException("Token não enviado no cabeçalho Authorization!");
}
return authorizationHeader.replace("Bearer ", "");
}
}
@RestController
@RequestMapping("/login")
public class AutenticacaoController {
@Autowired
private AuthenticationManager manager;
@Autowired
private TokenService tokenService;
@PostMapping
public ResponseEntity efetuarLogin(@RequestBody @Valid DadosAutenticacao dados) {
//Convertemos para o "DTO" do SpringSecurity
var authenticationToken = new UsernamePasswordAuthenticationToken(dados.login(), dados.senha());
//E usamos a AuthenticationManager para disparar o processo de autenticação
//e com isso ela chama a AutenticacaoService que chama o repository que vai no banco fazer a consulta
//e checa se o usuário e a senha existem, se sim, retorna o ResponseEntity, senão retorna 403
var authentication = manager.authenticate(authenticationToken);
var tokenJWT = tokenService.gerarToken((Usuario) authentication.getPrincipal());
return ResponseEntity.ok(new DadosTokenJWT(tokenJWT));
}
}
Seu código da classe Filter está incompleto. Precisa complementar com o restante explicado no vídeo seguinte: https://cursos.alura.com.br/course/spring-boot-aplique-boas-praticas-proteja-api-rest/task/117170