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

Erro 500 / Token JWT inválido ou expirado

Após realizar os passos do vídeo "Validando o token recebido", da aula 05.Controle de Acesso, estou recebendo o erro abaixo. Acredito que o Token JWT possa ter expirado, mas não sei se é esse o problema. Como devo fazer para receber um token válido?

{
    "timestamp": "2023-02-08T18:12:49.981+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Token JWT inválido ou expirado",
    "path": "/login"
}
4 respostas

Oi Eric!

Posta aqui o código das suas classes TokenService, SecurityFilter e AutenticacaoController

Oi, Rodrigo, obrigado por responder! Retrocedi alguns passos e gerei um novo token, segui nos passos da aula e aí funcionou. Porém fiz a aula seguinte e apenas obtenho um 403 quando tento fazer o POST na url /login. Seguem os códigos das classes:

@Service
public class TokenService {

    @Value("${api.security.token.secret}")
    private String secret;

    public String gerarToken(Usuario usuario) {

        try {
            Algorithm 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 {
            Algorithm 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().plusYears(2).toInstant(ZoneOffset.of("-03:00"));
    }
}
@Configuration
@EnableWebSecurity
public class SecurityConfigurations {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().authorizeHttpRequests()
                .requestMatchers(HttpMethod.POST, "/login").permitAll()
                .anyRequest().authenticated()
                .and().build();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}
@Component
public class SecurityFilter extends OncePerRequestFilter {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private UsuarioRepository repository;


    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        var tokenJWT = recuperarToken(request);

        if(tokenJWT != null){
            var subject = tokenService.getSubject(tokenJWT);
            UserDetails usuario = repository.findByLogin(subject);

            var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());

            SecurityContextHolder.getContext().setAuthentication(authentication);
        }

        filterChain.doFilter(request, response);
    }

    private String  recuperarToken(HttpServletRequest request) {
        var authorizationHeader = request.getHeader("Authorization");
        if(authorizationHeader != null){
            return authorizationHeader.replace("Bearer ", "");
        }
        return null;

    }
}

O código está certinho. Se está devolvendo 403 deve ser o usuário/senha enviados no json que estão incorretos. Manda um print aqui da requisição que você está disparando no Insomnia e faz um select na sua tabela de usuários para ver os registros cadastrados.

solução!

Verifiquei aqui, o usuário e a senha estavam corretos, mas eu estava enviando um token inválido ( :grinning_face_with_sweat: ) Obrigado pela ajuda!