From 0bf868d3cdf9226e178c076d3b588ed5207409a0 Mon Sep 17 00:00:00 2001
From: kongzy <kongzy>
Date: 星期五, 24 十一月 2023 17:51:40 +0800
Subject: [PATCH] merge

---
 assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java |  115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 115 insertions(+), 0 deletions(-)

diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java
new file mode 100644
index 0000000..fec4f2d
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java
@@ -0,0 +1,115 @@
+package com.gkhy.assess.common.utils;
+
+import cn.hutool.crypto.digest.DigestUtil;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.gkhy.assess.common.exception.ApiException;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+/**
+ * JwtToken生成的工具类
+ * JWT token的格式:header.payload.signature
+ * header的格式(算法、token的类型):
+ * {"alg": "HS512","typ": "JWT"}
+ * payload的格式(用户名、创建时间、生成时间):
+ * {"sub":"wang","created":1489079981393,"exp":1489684781}
+ * signature的生成算法:
+ * HMACSHA512(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
+ */
+public class JwtTokenUtil {
+    private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenUtil.class);
+
+    public static final String USER_LOGIN_TOKEN="Authorization";
+
+    public static final String CLAIM_KEY_USERNAME = "sub";
+    public static final String CLAIM_KEY_CREATED = "created";
+
+    public static String SECRET="nms-secret";
+
+    public static String tokenHead="";
+
+    /**Token有效期为7天(Token在reids中缓存时间为两倍)*/
+    public static final long EXPIRATION=(7 * 12) * 60 * 60 * 1000;  //JWT的超期限时间(60*60*24*7)
+
+    /**
+     * 校验token是否正确
+     * @param token
+     * @param username
+     * @param secret  用户密码
+     * @return
+     */
+    public static boolean verify(String token,String username,String secret){
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
+            DecodedJWT jwt = verifier.verify(token);
+            return true;
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+    /**
+     * 获取token中的信息  无需secret解密也能获得
+     * @param token
+     * @return
+     */
+    public static String getUsername(String token){
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("username").asString();
+        }catch (JWTDecodeException e){
+            return null;
+        }
+    }
+
+    /**
+     * 生成签名
+     * @param username
+     * @param secret
+     * @return
+     */
+    public static String sign(String username,String secret){
+        Date date=new Date(System.currentTimeMillis()+EXPIRATION*1000);
+        Algorithm algorithm=Algorithm.HMAC256(secret);
+        return JWT.create().withClaim("username",username).withExpiresAt(date).sign(algorithm);
+    }
+
+    /**
+     * 根据request中的token获取用户账号
+     *
+     * @param request
+     * @return
+     * @throws ApiException
+     */
+    public static String getUserNameByToken(HttpServletRequest request) throws ApiException {
+        String accessToken = request.getHeader(USER_LOGIN_TOKEN);
+        String username = getUsername(accessToken);
+        if (StringUtils.isEmpty(username)) {
+            throw new ApiException("未获取到用户");
+        }
+        return username;
+    }
+
+
+    /**
+     * md5加密
+     * @param token
+     * @return
+     */
+    public static String md5Encode(String token){
+
+        return DigestUtil.md5Hex(token);
+    }
+
+
+
+}

--
Gitblit v1.9.2