JwtTokenUtil.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package com.example.xiaoshiweixinback.business.jwt;
  2. import com.auth0.jwt.JWT;
  3. import com.auth0.jwt.JWTCreator;
  4. import com.auth0.jwt.algorithms.Algorithm;
  5. import com.example.xiaoshiweixinback.business.jwt.properties.JwtProperties;
  6. import com.example.xiaoshiweixinback.business.utils.ToolUtil;
  7. import io.jsonwebtoken.Claims;
  8. import io.jsonwebtoken.JwtException;
  9. import io.jsonwebtoken.Jwts;
  10. import io.jsonwebtoken.SignatureAlgorithm;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Component;
  13. import java.io.UnsupportedEncodingException;
  14. import java.util.Calendar;
  15. import java.util.Date;
  16. import java.util.HashMap;
  17. import java.util.Map;
  18. @Component
  19. public class JwtTokenUtil {
  20. private static String SECRET = "xiaoshi-weixin-background";
  21. @Autowired
  22. private JwtProperties jwtProperties;
  23. /**
  24. * 获取用户名从token中
  25. */
  26. public String getUsernameFromToken(String token) {
  27. return getClaimFromToken(token).getSubject();
  28. }
  29. /**
  30. * 获取jwt发布时间
  31. */
  32. public Date getIssuedAtDateFromToken(String token) {
  33. return getClaimFromToken(token).getIssuedAt();
  34. }
  35. /**
  36. * 获取jwt失效时间
  37. */
  38. public Date getExpirationDateFromToken(String token) {
  39. return getClaimFromToken(token).getExpiration();
  40. }
  41. /**
  42. * 获取jwt接收者
  43. */
  44. public String getAudienceFromToken(String token) {
  45. return getClaimFromToken(token).getAudience();
  46. }
  47. /**
  48. * 获取私有的jwt claim
  49. */
  50. public String getPrivateClaimFromToken(String token, String key) {
  51. return getClaimFromToken(token).get(key).toString();
  52. }
  53. /**
  54. * 获取md5 key从token中
  55. */
  56. public String getMd5KeyFromToken(String token) {
  57. return getPrivateClaimFromToken(token, jwtProperties.getMd5Key());
  58. }
  59. /**
  60. * 获取jwt的payload部分
  61. */
  62. public Claims getClaimFromToken(String token) {
  63. return Jwts.parser()
  64. .setSigningKey(jwtProperties.getSecret())
  65. .parseClaimsJws(token)
  66. .getBody();
  67. }
  68. /**
  69. * 解析token是否正确,不正确会报异常<br>
  70. */
  71. public void parseToken(String token) throws JwtException {
  72. Jwts.parser().setSigningKey(jwtProperties.getSecret()).parseClaimsJws(token).getBody();
  73. }
  74. /**
  75. * <pre>
  76. * 验证token是否失效
  77. * true:过期 false:没过期
  78. * </pre>
  79. */
  80. public Boolean isTokenExpired(String token) {
  81. final Date expiration = getExpirationDateFromToken(token);
  82. return expiration.before(new Date());
  83. }
  84. /**
  85. * 生成token(通过用户信息JSON格式和签名时候用的随机数)
  86. */
  87. public String generateToken(String userInfo, String randomKey) {
  88. Map<String, Object> claims = new HashMap<>();
  89. claims.put(jwtProperties.getMd5Key(), randomKey);
  90. return doGenerateToken(claims, userInfo);
  91. }
  92. public String createToken() throws UnsupportedEncodingException {
  93. //签发时间
  94. Date iatDate = new Date();
  95. Calendar nowTime = Calendar.getInstance();
  96. //设置过期时间 -1小时后过期
  97. nowTime.add(Calendar.MINUTE,1);
  98. //得到时间
  99. Date expiresDate = nowTime.getTime();
  100. //实例化组成头部header的map
  101. Map<String, Object> map = new HashMap<String, Object>();
  102. //声明类型,这里是jwt
  103. map.put("typ", "JWT");
  104. //声明加密的算法,通常直接使用HMAC SHA256
  105. map.put("alg", "HS256");
  106. //plyload 载荷,可以理解为承载的物品
  107. // iss: jwt签发者
  108. // sub: jwt所面向的用户
  109. // aud: 接收jwt的一方
  110. // exp: jwt的过期时间,这个过期时间必须要大于签发时间
  111. // nbf: 定义在什么时间之前,该jwt都是不可用的.
  112. // iat: jwt的签发时间
  113. // jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
  114. String token = JWT.create()
  115. .withHeader(map)//头部 header
  116. .withClaim("iss", "ADMIN") // 载荷 payload
  117. .withClaim("aud", "All")
  118. .withExpiresAt(expiresDate)//设置过期时间
  119. .withIssuedAt(iatDate)//设置签发时间
  120. .sign(Algorithm.HMAC256(SECRET));//验签singtrue加密
  121. return token;
  122. }
  123. /**
  124. * 生成token
  125. */
  126. private String doGenerateToken(Map<String, Object> claims, String subject) {
  127. final Date createdDate = new Date();
  128. final Date expirationDate = new Date(createdDate.getTime() + jwtProperties.getExpiration() * 1000);
  129. return Jwts.builder()
  130. .setClaims(claims)
  131. .setSubject(subject)
  132. .setIssuedAt(createdDate)
  133. .setExpiration(expirationDate)
  134. .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
  135. .compact();
  136. }
  137. /**
  138. * 获取混淆MD5签名用的随机字符串
  139. */
  140. public String getRandomKey() {
  141. return ToolUtil.getRandomString(6);
  142. }
  143. }