JWT token com spring, para autenticação de usuários - Resolvido
8 respostasResolvido
javaspring
G
guilhermebhte
Ao tentar validar este método: Jws parseClaimsJws = setSigningKey.parseClaimsJws(token);, ele mostra esta exceção na tela
JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
Preciso de validar o token do usuário.
Debugando.
Ao fazer o login ele gera este token: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIwMjY3OTUwMDYzNiIsImV4cCI6MTUyMjI3NjMxOX0.XBLiwl94He0ffVkf5TpcBKUob6PotuleSni5Hc9y8anPsES6WSO6f8Ki441UU_HGicyRAXmZKLBXsfQ2okFAqw
Quando ele pesquisa por um país ele utiliza este token, Consulta feito segundos depois. Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIwMjY3OTUwMDYzNiIsImV4cCI6MTUyMjI3NjMxOX0.XBLiwl94He0ffVkf5TpcBKUob6PotuleSni5Hc9y8anPsES6WSO6f8Ki441UU_HGicyRAXmZKLBXsfQ2okFAqw
publicclassJwtTokenUtilimplementsSerializable{staticfinalStringCLAIM_KEY_USERNAME="sub";staticfinalStringCLAIM_KEY_CREATED="iat";privatestaticfinallongserialVersionUID=-3301605591108950415L;@SuppressFBWarnings(value="SE_BAD_FIELD",justification="It's okay here")privateClockclock=DefaultClock.INSTANCE;@Value("${jwt.secret}")privateStringsecret;@Value("${jwt.expiration}")privateStringexpiration;publicStringgetUsernameFromToken(Stringtoken){returngetClaimFromToken(token,Claims::getSubject);}publicDategetIssuedAtDateFromToken(Stringtoken){returngetClaimFromToken(token,Claims::getIssuedAt);}publicDategetExpirationDateFromToken(Stringtoken){returngetClaimFromToken(token,Claims::getExpiration);}public<T>TgetClaimFromToken(Stringtoken,Function<Claims,T>claimsResolver){finalClaimsclaims=getAllClaimsFromToken(token);returnclaimsResolver.apply(claims);}privateClaimsgetAllClaimsFromToken(Stringtoken){Claimsbody=null;try{JwtParserparser=Jwts.parser();JwtParsersetSigningKey=parser.setSigningKey(secret);Jws<Claims>parseClaimsJws=setSigningKey.parseClaimsJws(token);body=parseClaimsJws.getBody();}catch(Exceptione){e.printStackTrace();}returnbody;}privateBooleanisTokenExpired(Stringtoken){finalDateexpiration=getExpirationDateFromToken(token);returnexpiration.before(clock.now());}privateBooleanisCreatedBeforeLastPasswordReset(Datecreated,DatelastPasswordReset){return(lastPasswordReset!=null&&created.before(lastPasswordReset));}privateBooleanignoreTokenExpiration(Stringtoken){// here you specify tokens, for that the expiration is ignoredreturnfalse;}publicStringgenerateToken(UserDetailsuserDetails){Map<String,Object>claims=newHashMap<>();returndoGenerateToken(claims,userDetails.getUsername());}privateStringdoGenerateToken(Map<String,Object>claims,Stringsubject){finalDatecreatedDate=clock.now();finalDateexpirationDate=calculateExpirationDate(createdDate);returnJwts.builder().setSubject(subject).setClaims(claims).setIssuedAt(createdDate).setExpiration(expirationDate).signWith(SignatureAlgorithm.HS512,secret).compact();}publicBooleancanTokenBeRefreshed(Stringtoken,DatelastPasswordReset){finalDatecreated=getIssuedAtDateFromToken(token);return!isCreatedBeforeLastPasswordReset(created,lastPasswordReset)&&(!isTokenExpired(token)||ignoreTokenExpiration(token));}publicStringrefreshToken(Stringtoken){finalDatecreatedDate=clock.now();finalDateexpirationDate=calculateExpirationDate(createdDate);finalClaimsclaims=getAllClaimsFromToken(token);claims.setIssuedAt(createdDate);claims.setExpiration(expirationDate);returnJwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512,secret).compact();}publicBooleanvalidateToken(Stringtoken,UserDetailsuserDetails){JwtUseruser=(JwtUser)userDetails;finalStringusername=getUsernameFromToken(token);finalDatecreated=getIssuedAtDateFromToken(token);// final Date expiration = getExpirationDateFromToken(token);return(username.equals(user.getUsername())&&!isTokenExpired(token)&&!isCreatedBeforeLastPasswordReset(created,user.getLastPasswordResetDate()));}privateDatecalculateExpirationDate(DatecreatedDate){returnnewDate(createdDate.getTime()+Long.parseLong(expiration)*1000);}}
G
guilhermebhte
Fiz conforme o exemplo do link que você me passou.
Acho que consegui resolver pois agora está com a mensagem que foi expirado.
io.jsonwebtoken.ExpiredJwtException: JWT expired at 2018-03-29T13:15:18Z. Current time: 2018-03-29T13:17:40Z, a difference of 142980 milliseconds. Allowed clock skew: 0 milliseconds.