JwtTokenUtil.java 3.81 KB
Newer Older
liqin's avatar
liqin committed
1
package cn.chnmuseum.party.auth.util;
liqin's avatar
liqin committed
2

liqin's avatar
liqin committed
3
import cn.chnmuseum.party.common.util.DateUtil80;
liqin's avatar
liqin committed
4 5 6 7 8
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;
liqin's avatar
liqin committed
9
import lombok.extern.slf4j.Slf4j;
liqin's avatar
liqin committed
10 11 12 13 14 15
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
liqin's avatar
liqin committed
16
@Slf4j
liqin's avatar
liqin committed
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
public class JwtTokenUtil {

    private static String jwtTokenSecret;
    private static String jwtTokenIssuer;
    private static String jwtTokenExpiration;

    @Value("${jwt.secret}")
    public void setJwtTokenSecret(String jwtTokenSecret) {
        JwtTokenUtil.jwtTokenSecret = jwtTokenSecret;
    }

    @Value("${jwt.issuer}")
    public void setJwtTokenIssuer(String jwtTokenIssuer) {
        JwtTokenUtil.jwtTokenIssuer = jwtTokenIssuer;
    }

    @Value("${jwt.expiration}")
    public void setJwtTokenExpiration(String jwtTokenExpiration) {
        JwtTokenUtil.jwtTokenExpiration = jwtTokenExpiration;
    }

    /**
     * 校验token是否正确
     *
     * @param token 密钥
     * @return 是否正确
     */
    public static String verify(String token, String username) {
        try {
            Algorithm algorithm = Algorithm.HMAC512(jwtTokenSecret);
            JWTVerifier verifier = JWT.require(algorithm).withIssuer(jwtTokenIssuer).withSubject(username).build();
            DecodedJWT jwt = verifier.verify(token);
49
            return jwt.getClaim("user_id").asString();
liqin's avatar
liqin committed
50
        } catch (Exception e) {
liqin's avatar
liqin committed
51
            log.error(e.getMessage());
liqin's avatar
liqin committed
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
            return null;
        }
    }

    /**
     * 获得token中的信息无需secret解密也能获得
     *
     * @return token中包含的用户名
     */
    public static String getUsername(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getSubject();
        } catch (JWTDecodeException e) {
            return null;
        }
    }

    /**
     * 获得token中的信息无需secret解密也能获得
     *
     * @return token中包含的用户名
     */
    public static String getEmployeeId(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
78
            return jwt.getClaim("user_id").asString();
liqin's avatar
liqin committed
79 80 81 82 83 84 85 86 87 88 89
        } catch (JWTDecodeException e) {
            return null;
        }
    }

    /**
     * 生成签名,60min后过期
     *
     * @param username 用户名
     * @return 加密的token
     */
liqin's avatar
liqin committed
90
    public static String sign(String username, String employeeId) {
liqin's avatar
liqin committed
91 92 93 94 95
        LocalDateTime currentTime = DateUtil80.getDateTimeOfTimestamp(System.currentTimeMillis());
        Algorithm algorithm = Algorithm.HMAC512(jwtTokenSecret);
        // 附带username信息
        return JWT.create().withIssuer(jwtTokenIssuer)
                // 创建时间
liqin's avatar
liqin committed
96 97
                .withIssuedAt(DateUtil80.getCurrDateTime()).withSubject(username)
                .withClaim("user_id", employeeId)
liqin's avatar
liqin committed
98 99 100 101 102 103 104 105 106
                .withExpiresAt(DateUtil80.asDate(currentTime.plusMinutes(240))).sign(algorithm);
    }

    /**
     * 生成签名,30day后过期
     *
     * @param username 用户名
     * @return 加密的token
     */
liqin's avatar
liqin committed
107
    public static String signByRememberMe(String username, Integer userId) {
liqin's avatar
liqin committed
108 109 110 111 112 113 114 115 116 117 118
        LocalDateTime currentTime = DateUtil80.getDateTimeOfTimestamp(System.currentTimeMillis());
        Algorithm algorithm = Algorithm.HMAC512(jwtTokenSecret);
        // 附带username信息
        return JWT.create().withIssuer(jwtTokenIssuer)
                // 创建时间
                .withIssuedAt(DateUtil80.getCurrDateTime()).withSubject(username).withClaim("userId", userId)
                .withExpiresAt(DateUtil80.asDate(currentTime.plusSeconds(Integer.parseInt(jwtTokenExpiration))))
                .sign(algorithm);
    }

}