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

Token inválido do JWT

Estou obtendo um token inválido com o código abaixo, alguém poderia me dizer por qual motivo?

@Service
public class GeradorToken {

    public String gerarToken(DtoUsuario usuario) {
        
        try {
            Algorithm algoritmo = Algorithm.HMAC256("123456");
            return JWT.create()
                    .withExpiresAt(dataExpiracao())
                    .sign(algoritmo);
            
        } catch (JWTCreationException exception) {
            throw new RuntimeException("ERRO AO GERAR O TOKEN JWT", exception);
        }
    }
    
    private Instant dataExpiracao() {
        return LocalDateTime.now().plusHours(1).toInstant(ZoneOffset.of("-03:00"));
    }
    
}
3 respostas

Olá Anderson!

Existem algumas possibilidades para esse problema. Uma delas é que o algoritmo de criptografia usado para assinar o token não está sendo reconhecido pelo serviço que está validando o token. Certifique-se de que o mesmo algoritmo de criptografia está sendo usado tanto para gerar quanto para validar o token.

Outra possibilidade é que a chave secreta esteja incorreta. Verifique se a chave secreta usada para gerar o token é a mesma que está sendo usada para validá-lo.

Além disso, verifique se a data de expiração do token está correta. No seu código, você está definindo a data de expiração para uma hora após a geração do token. Certifique-se de que o serviço que está validando o token está considerando corretamente a data de expiração.

Caso nenhuma dessas soluções resolva o problema, pode ser necessário investigar mais a fundo o código e as configurações do serviço que está validando o token. Verifique se há algum log de erro ou mensagem de erro específica que possa ajudar a identificar a causa do problema.

Espero ter ajudado e bons estudos!

Olá, @Matheus, obrigado pela disposição em me ajudar.

Infelizmente no caso, o token já me aparece inválido só de colocar no site do JWT, acho que tenha algo errado na geração do meu token.

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

solução!

Observando hoje, percebi que o código responsável por gerar o token está correto o problema é o validador porque havia utilizado as mesmas informações para validar a chave no caso o "Issuer" e o "Subject". Corrigido isso, tudo voltou a normal, segue o código corrigido.

  • Gerar o token:
@Service
public class GeradorToken {
    
    @Value("${api.security.token.secret}")
    private String token;
    
    public String gerarToken() {
        
        try {
            Algorithm algoritmo = Algorithm.HMAC256(token);
            return JWT.create()
                    .withIssuer("API")
                    .withSubject("ANDERSON")
                    .withClaim("Idade do Usuario", 22L)
                    .withExpiresAt(dataExpiracao())
                    .sign(algoritmo);            
            
        } catch (JWTCreationException exception) {
            
            throw new RuntimeException("ERRO AO GERAR O TOKEN JWT", exception);
        }
    }
     
    private Instant dataExpiracao() {
        return LocalDateTime.now().plusHours(1).toInstant(ZoneOffset.of("-03:00"));
    }
}
  • Validação do Token:
@Service
public class ValidadorToken {
    
    @Value("${api.security.token.secret}")
    private String token;

    public Long getSubject(String tokenJWT) {
        
        try {
                Algorithm hmac256 = Algorithm.HMAC256(token);
                
                return JWT.require(hmac256)
                        .withIssuer("API")
                        .withSubject("ANDERSON")
                        .build()
                        .verify(tokenJWT)
                        .getClaim("Idade do Usuario")
                        .asLong();
        } catch (JWTVerificationException exception) {
                System.out.println("Exception: "+exception.toString());
                System.out.println("Exception Message: "+exception.getMessage());
                throw new RuntimeException("Token JWT inválido ou expirado!");
        }
    }
}

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