kongzy
2023-11-24 ebe94e19812a1b24257d60831ec932756855e94b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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);
    }
 
 
 
}