import io.jsonwebtoken.*;

import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;
import java.util.Map;
import java.util.UUID;

/**
 * @Description:
 * @Author: zhanghua
 * @DateTime: Created in 2022/12/12 1:22 PM 星期一
 */
public class JwtUtils {

    /**
     * key(按照签名算法的字节长度设置key)
     */
    private final static String SECRET_KEY = "0123456789_0123456789_0123456789";
/**
 * 过期时间(毫秒单位)
 */
private final static long TOKEN_EXPIRE_MILLIS = 1000 * 60 * 60;

/**
 * 创建token
 * @param claimMap
 * @return
 */
public static String createToken(Map<String, Object> claimMap) {
    long currentTimeMillis = System.currentTimeMillis();
    return Jwts.builder()
            .setId(UUID.randomUUID().toString())
            .setIssuedAt(new Date(currentTimeMillis))    // 设置签发时间
            .setExpiration(new Date(currentTimeMillis + TOKEN_EXPIRE_MILLIS))   // 设置过期时间
            .addClaims(claimMap)
            .signWith(generateKey())
            .compact();
}

/**
 * 验证token
 * @param token
 * @return 0 验证成功,1、2、3、4 验证失败
 */
public static int verifyToken(String token) {
    try {
        Jwts.parser().setSigningKey(generateKey()).parseClaimsJws(token);
        return 0;
    } catch (ExpiredJwtException e) { // 过期JWT异常
        e.printStackTrace();
        return 1;
    } catch (UnsupportedJwtException e) { // 不支持JWT异常
        e.printStackTrace();
        return 2;
    } catch (MalformedJwtException e) { // 格式不正确的JWT
        e.printStackTrace();
        return 3;
    }  catch (IllegalArgumentException e) { // 非法数据异常
        e.printStackTrace();
        return 4;
    }
}

/**
 * 解析token
 * @param token
 * @return
 */
public static Claims parseToken(String token) {
    return Jwts.parser()  // 得到DefaultJwtParser
            .setSigningKey(generateKey()) // 设置签名密钥
            .parseClaimsJws(token)
            .getBody();
}
/**
 * 生成安全密钥
 * @return
 */
public static Key generateKey() {
    return new SecretKeySpec(SECRET_KEY.getBytes(), SignatureAlgorithm.HS256.getJcaName());
}