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?
@ServicepublicclassGeradorToken{publicStringgerarToken(DtoUsuariousuario){try{Algorithmalgoritmo=Algorithm.HMAC256("123456");returnJWT.create().withIssuer("API").withSubject(usuario.getLogin()).withExpiresAt(dataExpiracao()).sign(algoritmo);}catch(JWTCreationExceptionexception){thrownewRuntimeException("ERRO AO GERAR O TOKEN JWT",exception);}}privateInstantdataExpiracao(){returnLocalDateTime.now().plusHours(1).toInstant(ZoneOffset.of("-03:00"));}}
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:
@ServicepublicclassValidadorToken{@Value("${api.security.token.secret}")privateStringtoken;publicStringgetSubject(StringtokenJWT){try{Algorithmhmac256=Algorithm.HMAC256(token);returnJWT.require(hmac256).withIssuer("API").build().verify(tokenJWT).getSubject();}catch(JWTVerificationExceptionexception){thrownewRuntimeException("Token JWT inválido ou expirado!");}}}
a pilha do erro estoura no erro de JWTVerificationException
L
Solucao aceita
Lucas_Camara
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.
A
Anderson-Machado
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.
@ServicepublicclassGeradorToken{@Value("${api.security.token.secret}")privateStringtoken;publicStringgerarToken(){try{Algorithmalgoritmo=Algorithm.HMAC256(token);returnJWT.create().withIssuer("API").withSubject("ANDERSON").withClaim("Idade do Usuario",22L).withExpiresAt(dataExpiracao()).sign(algoritmo);}catch(JWTCreationExceptionexception){thrownewRuntimeException("ERRO AO GERAR O TOKEN JWT",exception);}}privateInstantdataExpiracao(){returnLocalDateTime.now().plusHours(1).toInstant(ZoneOffset.of("-03:00"));}}
e este é o código da validação do token corrigido.
@ServicepublicclassValidadorToken{@Value("${api.security.token.secret}")privateStringtoken;publicLonggetSubject(StringtokenJWT){try{Algorithmhmac256=Algorithm.HMAC256(token);returnJWT.require(hmac256).withIssuer("API").withSubject("ANDERSON").build().verify(tokenJWT).getClaim("Idade do Usuario").asLong();}catch(JWTVerificationExceptionexception){System.out.println("Exception: "+exception.toString());System.out.println("Exception Message: "+exception.getMessage());thrownewRuntimeException("Token JWT inválido ou expirado!");}}}