jwt

作者: momdiemg | 来源:发表于2020-03-19 15:29 被阅读0次
       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;
        }
    }

}


    


相关文章

  • JsonWebToken

    JWT (JsonWebToken) JWT官网['https://jwt.io/'] JWT简介 1.JWT(J...

  • JWT介绍和使用

    最权威网址 JWT官网: https://jwt.io/ 什么是JWT Json web token (JWT),...

  • JWT实现token验证

    JWT官网:https://jwt.io/[https://jwt.io/] JWT(Java版)的github地...

  • 使用RSA公私钥实现JWT令牌的签名和验签

    使用RSA公私钥实现JWT令牌的签名和验签 1、什么是JWT令牌 JWT基本概念可从JWT[https://jwt...

  • JWT Spring-security

    JWT设计原理 JWT结合spring-security在项目中的应用 JWT[https://jwt.io/in...

  • JWT的介绍解析

    JWT的介绍解析 一、什么是JWT?了解JWT,认知JWT 首先jwt其实是三个英语单词JSON Web Toke...

  • JWT、SWT、SAML

    一、 JWT from:https://jwt.io/introduction[https://jwt.io/in...

  • jwt 在微服务中应用

    jwt token jwt 在api 方式中表中的token生成,验证以及获取jwt解密后携带的用户信息 jwt ...

  • FusionAuth JWT

    本文介绍基于 FusionAuth JWT 的 JWT 实现方法。 目录 FusionAuth JWT 简介 代码...

  • .Net Core接入JWT

    JWT网站:https://jwt.io/ JWT基础内容:https://baijiahao.baidu.com...

网友评论

      本文标题:jwt

      本文链接:https://www.haomeiwen.com/subject/tnrlyhtx.html