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

Token Expirado

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.

3 respostas

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

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

@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));

    }

}
solução!

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

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