JwtTokenUtil.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package com.izouma.walkchina.security;
  2. import io.jsonwebtoken.Claims;
  3. import io.jsonwebtoken.Jwts;
  4. import io.jsonwebtoken.SignatureAlgorithm;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.security.core.userdetails.UserDetails;
  8. import org.springframework.stereotype.Component;
  9. import java.io.Serializable;
  10. import java.util.Date;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import java.util.function.Function;
  14. @Component
  15. public class JwtTokenUtil implements Serializable {
  16. private static final long serialVersionUID = -3722940977538012340L;
  17. public static final long JWT_TOKEN_VALIDITY = 60 * 60 * 24 * 30;
  18. @Value("${jwt.secret}")
  19. private String secret;
  20. //retrieve username from jwt token
  21. public String getUsernameFromToken(String token) {
  22. return getClaimFromToken(token, Claims::getSubject);
  23. }
  24. //retrieve expiration date from jwt token
  25. public Date getExpirationDateFromToken(String token) {
  26. return getClaimFromToken(token, Claims::getExpiration);
  27. }
  28. public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
  29. final Claims claims = getAllClaimsFromToken(token);
  30. return claimsResolver.apply(claims);
  31. }
  32. //for retrieveing any information from token we will need the secret key
  33. private Claims getAllClaimsFromToken(String token) {
  34. return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
  35. }
  36. //check if the token has expired
  37. private Boolean isTokenExpired(String token) {
  38. final Date expiration = getExpirationDateFromToken(token);
  39. return expiration.before(new Date());
  40. }
  41. //generate token for user
  42. public String generateToken(UserDetails userDetails) {
  43. Map<String, Object> claims = new HashMap<>();
  44. return doGenerateToken(claims, userDetails.getUsername());
  45. }
  46. //while creating the token -
  47. //1. Define claims of the token, like Issuer, Expiration, Subject, and the ID
  48. //2. Sign the JWT using the HS512 algorithm and secret key.
  49. //3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1)
  50. // compaction of the JWT to a URL-safe string
  51. private String doGenerateToken(Map<String, Object> claims, String subject) {
  52. return Jwts.builder()
  53. .setClaims(claims)
  54. .setSubject(subject)
  55. .setIssuedAt(new Date(System.currentTimeMillis()))
  56. .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000))
  57. .signWith(SignatureAlgorithm.HS512, secret).compact();
  58. }
  59. //validate token
  60. public Boolean validateToken(String token, UserDetails userDetails) {
  61. final String username = getUsernameFromToken(token);
  62. if (StringUtils.isEmpty(username) || userDetails == null) {
  63. return false;
  64. }
  65. return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
  66. }
  67. }