Estou tentando gerar um token com o código abaixo, porém quando eu testo ele no site do : https://jwt.io/ ele me diz que o token “Invalid Signature”. Alguém sabe me dizer o que estou fazendo de errado?
@Service
public class GeradorToken {
public String gerarToken(DtoUsuario usuario) {
try {
Algorithm algoritmo = Algorithm.HMAC256("123456");
return JWT.create()
.withIssuer("API")
.withSubject(usuario.getLogin())
.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"));
}
}
Aumente a chave. Algo como:
"uanhy87q6r47q3yhe4rinahd6q3tr45qrw6duyhnwie**6e78q346tyonp043897ntv7syehd6354w763t46wtjkvnalkiasd6"
Eu só digitei vários caracteres à esmo. Faça a mesma coisa. Verifique se deu certo.
Ainda continuando dando inválido.
Percebi que o erro não é a geração do token, mas a validação mesmo, neste caso o código da validação é este:
@Service
public class ValidadorToken {
@Value("${api.security.token.secret}")
private String token;
public String getSubject(String tokenJWT) {
try {
Algorithm hmac256 = Algorithm.HMAC256(token);
return JWT.require(hmac256)
.withIssuer("API")
.build()
.verify(tokenJWT)
.getSubject();
} catch (JWTVerificationException exception) {
throw new RuntimeException("Token JWT inválido ou expirado!");
}
}
}
a pilha do erro estoura no erro de JWTVerificationException
Esse inválido no site jwt.io é pq vc não colocou a secret ali no canto inferior direito. Coloque a secret primeiro e só depois informe o token para verificar se ele é válido.
Obrigado @Lucas_Camara , no caso percebi no final que o problema realmente não estava na geração do token como você bem observou, mas no fato de que as informações que utilizei para gerar a chave não eram as mesmas que foram utilizadas para validar a chave.
Este era o código de geração do token corrigido.
@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"));
}
}
e este é o código da validação do token corrigido.
@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!");
}
}
}
Agradeço todo apoio.