XiaoRuby
2023-08-07 d8a687741273d121586b83745280c57f7e9d3297
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
package com.yuanchu.limslaboratory.shiro.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import javax.annotation.PostConstruct;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
@Component
public class JwtUtils {
    private static String staticSecret;
    @Value("${login.secret}")
    private String secret;
    @PostConstruct
    public void getApiToken() {
        staticSecret = this.secret;
    }
    public static String getSecret() {
        // lockie.zou
        return staticSecret;
    }
    // è¿‡æœŸæ—¶é—´ 2 å°æ—¶
    private static final long EXPIRE_TIME = 2 * 60 * 60 * 1000;
    //自己定制密钥
    public static final String SECRET = "J-(t]Poe9P";
    //请求头
    public static final String AUTH_HEADER = "X-Token";  // X-Authorization-With
    /**
     * éªŒè¯token是否正确
     * @param token
     * @return
     */
    public static boolean verify(String token){
        try{
            String account = getClaimFiled(token, "account");
            if (account == null){
                return false;
            }
            Algorithm algorithm = Algorithm.HMAC256(getSecret());
            JWTVerifier verifier = JWT.require(algorithm).withClaim("account",account).build();
            verifier.verify(token);
            return true;
        } catch (JWTVerificationException exception){
            return false;
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
    /**
     * èŽ·å¾—token中的自定义信息,一般是获取token的username,无需secret解密也能获得
     * @param token
     * @param filed
     * @return
     */
    public static String getClaimFiled(String token, String filed){
        try{
            if (!ObjectUtils.isEmpty(token)){
                DecodedJWT jwt = JWT.decode(token);
                return jwt.getClaim(filed).asString();
            }
            return null;
        } catch (JWTDecodeException e){
            return null;
        }
    }
    /**
     * ç”Ÿæˆç­¾å,准确地说是生成token
     * @return
     */
    public static String sign(String account){
        try{
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            //附带username,nickname信息
            return JWT.create()
                    .withClaim("account",account)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (JWTCreationException e){
            e.printStackTrace();
            return null;
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
    /**
     * èŽ·å–token的签发时间
     * @param token
     * @return
     */
    public static Date getIssueAt(String token){
        try{
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getIssuedAt();
        } catch (JWTDecodeException e){
            e.printStackTrace();
            return null;
        }
    }
    /**
     * éªŒè¯token是否过期
     * @param token
     * @return
     */
    public static boolean isTokenExpired(String token){
        Date now = Calendar.getInstance().getTime();
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getExpiresAt().before(now);
    }
    /**
     * åˆ·æ–°token的有效期
     * @param token
     * @param secret
     * @return
     */
    public static String refreshTokenExpired(String token, String secret){
        DecodedJWT jwt = JWT.decode(token); //解析token
        Map<String, Claim> claims = jwt.getClaims(); //获取token的参数信息
        try{
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTCreator.Builder builder = JWT.create().withExpiresAt(date);
            for(Map.Entry<String,Claim> entry : claims.entrySet()){
                builder.withClaim(entry.getKey(),entry.getValue().asString());
            }
            return builder.sign(algorithm);
        } catch (JWTCreationException e){
            e.printStackTrace();
            return null;
        }
    }
}