ApiTokenUtils.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package com.ozs.common.utils;
  2. import com.ozs.common.constant.CacheConstants;
  3. import com.ozs.common.constant.Constants;
  4. import com.ozs.common.core.domain.model.LoginUser;
  5. import com.ozs.common.core.redis.RedisCache;
  6. import com.ozs.common.utils.ip.AddressUtils;
  7. import com.ozs.common.utils.ip.IpUtils;
  8. import com.ozs.common.utils.uuid.IdUtils;
  9. import eu.bitwalker.useragentutils.UserAgent;
  10. import io.jsonwebtoken.Claims;
  11. import io.jsonwebtoken.Jwts;
  12. import io.jsonwebtoken.SignatureAlgorithm;
  13. import io.swagger.models.auth.In;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.stereotype.Component;
  17. import javax.servlet.http.HttpServletRequest;
  18. import java.util.ArrayList;
  19. import java.util.HashMap;
  20. import java.util.Map;
  21. import java.util.concurrent.TimeUnit;
  22. @Component
  23. public class ApiTokenUtils {
  24. @Autowired
  25. private RedisCache redisCache;
  26. // 令牌自定义标识
  27. @Value("${token.header}")
  28. private String header;
  29. // 令牌秘钥
  30. @Value("${token.secret}")
  31. private String secret;
  32. // 令牌有效期(默认30分钟)
  33. @Value("${token.expireTime}")
  34. private int expireTime;
  35. protected static final long MILLIS_SECOND = 1000;
  36. protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
  37. private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
  38. /**
  39. * 地址灾害获取token信息
  40. *
  41. * @return 用户信息
  42. */
  43. public String getGeoHazardMonitorToken(HttpServletRequest request) {
  44. // 获取请求携带的令牌
  45. String token = getGeoToken(request);
  46. if (StringUtils.isNotEmpty(token)) {
  47. try {
  48. Claims claims = parseToken(token);
  49. // 解析对应的权限
  50. String clientId = (String) claims.get(Constants.GEOHAZARDMONITOR_KEY);
  51. String userKey = getGeoHazardMonitorTokenKey(clientId);
  52. String tokens = redisCache.getCacheObject(userKey);
  53. return tokens;
  54. } catch (Exception e) {
  55. }
  56. }
  57. return null;
  58. }
  59. /**
  60. * 地址灾害创建令牌
  61. *
  62. * @return
  63. */
  64. public ArrayList<String> createGeoHazardMonitorToken(String grantType, String clientId, String clientSecret) {
  65. ArrayList<String> parameter = new ArrayList<>();
  66. String token = IdUtils.fastUUID();
  67. String tokenKey = getGeoHazardMonitorTokenKey(clientId);
  68. parameter.add(String.valueOf(System.currentTimeMillis() + expireTime * MILLIS_MINUTE));
  69. StringBuilder stringBuilder=new StringBuilder();
  70. stringBuilder.append(token);
  71. stringBuilder.append("-");
  72. stringBuilder.append(grantType);
  73. stringBuilder.append("-");
  74. stringBuilder.append(clientId);
  75. stringBuilder.append("-");
  76. stringBuilder.append(clientSecret);
  77. String tokens = stringBuilder.toString();
  78. redisCache.setCacheObject(tokenKey, tokens, expireTime, TimeUnit.MINUTES);
  79. Map<String, Object> claims = new HashMap<>();
  80. claims.put(Constants.GEOHAZARDMONITOR_KEY, clientId);
  81. parameter.add(createToken(claims));
  82. return parameter;
  83. }
  84. /**
  85. * 从数据声明生成令牌
  86. *
  87. * @param claims 数据声明
  88. * @return 令牌
  89. */
  90. private String createToken(Map<String, Object> claims) {
  91. String token = Jwts.builder()
  92. .setClaims(claims)
  93. .signWith(SignatureAlgorithm.HS512, secret).compact();
  94. return token;
  95. }
  96. /**
  97. * 从令牌中获取数据声明
  98. *
  99. * @param token 令牌
  100. * @return 数据声明
  101. */
  102. private Claims parseToken(String token) {
  103. return Jwts.parser()
  104. .setSigningKey(secret)
  105. .parseClaimsJws(token)
  106. .getBody();
  107. }
  108. /**
  109. * 获取请求token
  110. *
  111. * @param request
  112. * @return token
  113. */
  114. private String getGeoToken(HttpServletRequest request) {
  115. String token = request.getHeader(header);
  116. if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) {
  117. token = token.replace(Constants.TOKEN_PREFIX, "");
  118. }
  119. return token;
  120. }
  121. private String getGeoHazardMonitorTokenKey(String uuid) {
  122. return CacheConstants.GEOHAZARDMONITOR_LOGIN_TOKEN_KEY + uuid;
  123. }
  124. }