jwt

2020-03-19  本文已影响0人  momdiemg
       package com.feiu2.client.util;

import com.alibaba.fastjson.JSON;
import com.feiu2.common.util.DateUtil;
import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;
import net.minidev.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thymeleaf.util.StringUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * jwt用户登录工具
 *
 * @author lhz<br>
 * @createDate 2019/09/03 9:00 <br>
 */
public class JwtUtil {
    private static Logger logger = LoggerFactory.getLogger(JwtUtil.class);
    /**
     * 1.创建一个32-byte的密匙
     */

    private static final byte[] secret = "ZHEJIANGHANGZHOUYUANDONGGONGYEGS".getBytes();

    //生成一个token
    public static String creatToken(Map<String, Object> map) {
        map.put("exp", DateUtil.afterHourTime(1));
        JWSHeader jwsHeader = new JWSHeader(JWSAlgorithm.HS256);
        Payload payload = new Payload(new JSONObject(map));
        JWSObject jwsObject = new JWSObject(jwsHeader, payload);
        try {
            JWSSigner jwsSigner = new MACSigner(secret);
            jwsObject.sign(jwsSigner);
            String token = jwsObject.serialize();
            return JwtUtil.encryptBASE64(token);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("token生成异常", e);
        }
        //生成token
        return null;
    }

    //解析一个token
    public static Map<String, Object> valid(String token) {
        try {
            JWSObject jwsObject = JWSObject.parse(token);
            Payload payload = jwsObject.getPayload();
            JWSVerifier jwsVerifier = new MACVerifier(secret);
            if (jwsObject.verify(jwsVerifier)) {
                JSONObject jsonObject = payload.toJSONObject();
                return JSON.parseObject(jsonObject.toJSONString(), Map.class);
//                if (jsonObject.containsKey("exp")) {
//                    Long expTime = Long.valueOf(jsonObject.get("exp").toString());
//                    Long nowTime = DateUtil.afterHourTime(0);
//                    if (expTime >= nowTime) {
//                        logger.info("token {} 验证通过,载体:{}", token, jsonObject.toJSONString());
//                        return JSON.parseObject(jsonObject.toJSONString(), Map.class);
//                    }
//                    //过期
//                    logger.error("token {} 过期,载体:{}", token, jsonObject.toJSONString());
//                }
            } else {
                logger.error("token 核实失败!是伪造的。");
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("token解析异常", e);
        }
        return null;
    }

    //解析token
    public static Map<String, Object> ValidToken(String token) {
        //解析token
        try {
            if (token != null) {
                String decode = JwtUtil.decryptBASE64(token);
                return JwtUtil.valid(decode);
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("token解析异常", e);
        }
        return null;
    }

    /**
     * token中获取userId
     *
     * @param token
     * @return
     */
    public static Long getUserId(String token) {
        Map<String, Object> validMap = ValidToken(token);
        if (null != validMap && !validMap.isEmpty()) {
            return Long.parseLong(validMap.get("userId").toString());
        } else {
            return null;
        }
    }


    /**
     * BASE64加密
     */
    public static String encryptBASE64(String key) throws Exception {
        String tokenKey = (new BASE64Encoder()).encodeBuffer(key.getBytes());
        return tokenKey.replaceAll("[\\s*\t\n\r]", "");
    }

    /**
     * BASE64解密
     *
     * @throws Exception
     */
    public static String decryptBASE64(String key) throws Exception {
        return new String((new BASE64Decoder()).decodeBuffer(key));
    }

    /**
     * token中获取orgId
     *
     * @param request
     * @return
     */
    public static Long getUserId(HttpServletRequest request) {
        String token = request.getHeader("token");
        //String token = request.getParameter("token");
        if (StringUtils.isEmpty(token)) {
            return null;
        }
        Map<String, Object> validMap = ValidToken(token);
        if (null != validMap && !validMap.isEmpty()) {
            return Long.parseLong(validMap.get("userId").toString());
        } else {
            return null;
        }
    }

    /**
     * token中获取orgId
     * request
     *
     * @param request
     * @return
     */
    public static Long getOrgId(HttpServletRequest request) {
        //String token = request.getParameter("token");
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            return null;
        }
        Map<String, Object> validMap = ValidToken(token);
        if (null != validMap && !validMap.isEmpty()) {
            return Long.parseLong(validMap.get("orgId").toString());
        } else {
            return null;
        }
    }

}


    


上一篇 下一篇

猜你喜欢

热点阅读