package com.changfa.utils;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.HashMap;

public class JwtUtil {

    //jwt标识，这里自己可以进行修改
    static String JWT_ID="tokenId";

    //秘钥，也可以将其放在配置文件中
    static String secretKey="KHSDFSDIII$))$$GGGGG";



    /**
     * 生成token,claims中存放一个类，方便我们在直接获取类进行处理
     */
    public static String genToken(Object tokenData, Integer expiredMinute){

        DateTime date = DateUtil.date();

        HashMap<String, Object> claims = new HashMap<>();
        claims.put("data", tokenData);

        //构建JwtBuilder
        JwtBuilder builder = Jwts.builder()
                .setClaims(claims) //私有声明，用于存放有效信息
                .setId(JWT_ID) //是JWT的唯一标识
                .setIssuedAt(date) //签发时间
                .signWith(SignatureAlgorithm.HS256, secretKey); //加密算法

        /**
         * compact:压缩，将header,playload,signature压缩成token字符串
         */
        String compact = builder.compact();
        return compact;
    }



    /**
     * 获取tokenData
     */
    public static Object getTokenData(String token){
        Claims body;
        try {
            //使用jwt解析器
            body = Jwts.parser()
                    .setSigningKey(secretKey)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return null;
        }
        //获取到放入的的data
        Object data = JSONObject.toJSONString(body.get("data", Object.class));
        //将获取到的json转成对应的类
        return data;
    }
}

