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;
}
}
}
网友评论