package com.yl.common;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.json.JSONObject;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.RegisteredPayload;
import com.yl.exceptions.BaseErrorCode;
import com.yl.exceptions.RRException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import java.util.HashMap;
import java.util.Map;
/**
* JWTUtil
* static final String key = "1122334";
* <p>
* public static void main(String[] args) {
* Map<String, String> data = new HashMap();
* data.put("loginAccount", "wangwangdui");
* data.put("roleIds", "1,2,3");
* String token = JWTUtils.generateToken(key, data);
* <p>
* JSONObject jsonObject = JWTUtils.verifyToken(key, token);
* System.out.println(jsonObject);
* }
*
* @author wangxiaohu
* @date 2022-12-08 13:52
*/
@Slf4j
public class JWTUtils {
public static final String KEY = "自己的那个长长的串串";
/**
* 生成token
*
* @param data data
* @return String
*/
public static String generateToken(Map<String, String> data) {
return generateToken(KEY, data);
}
/**
* 生成token
*
* @param key key
* @param data data
* @return String
*/
public static String generateToken(String key, Map<String, String> data) {
DateTime now = DateTime.now();
DateTime newTime = now.offsetNew(DateField.MINUTE, 10752);
Map<String, Object> payload = new HashMap<>();
//签发时间
payload.put(RegisteredPayload.ISSUED_AT, now);
//过期时间
payload.put(RegisteredPayload.EXPIRES_AT, newTime);
//生效时间
payload.put(RegisteredPayload.NOT_BEFORE, now);
//荷载数据
payload.putAll(data);
String token = JWTUtil.createToken(payload, key.getBytes());
log.info("生成token->" + token);
return token;
}
/**
* 验证token
*
* @param token token
* @return JSONObject
*/
public static JSONObject verifyToken(String token) {
return verifyToken(KEY, token);
}
/**
* 验证token
*
* @param key key
* @param token token
* @return JSONObject
*/
public static JSONObject verifyToken(String key, String token) {
JWT jwt = JWTUtil.parseToken(token);
boolean verifyKey = jwt.setKey(key.getBytes()).verify();
log.info("验证key->key:" + verifyKey);
boolean verifyTime = jwt.validate(0);
log.info("验证verifyTime->verifyTime:" + verifyTime);
if (!verifyKey || !verifyTime) {
throw new RRException(BaseErrorCode.AUTH_TOKEN_VALIDATE_ERROR);
}
JWTPayload payload = jwt.getPayload();
JSONObject claimsJson = payload.getClaimsJson();
if (ObjectUtils.isEmpty(claimsJson.get("wd"))) {
throw new RRException(BaseErrorCode.AUTH_TOKEN_VALIDATE_ERROR);
}
log.info(claimsJson.toString());
return claimsJson;
}
}