package com.kidgrow.jwt.utils;
|
|
import com.kidgrow.common.constant.BaseConstants;
|
import com.kidgrow.common.exception.BizException;
|
import com.kidgrow.common.exception.code.ExceptionCode;
|
import com.kidgrow.common.utils.DateUtils;
|
import com.kidgrow.common.utils.NumberHelper;
|
import com.kidgrow.common.utils.StrHelper;
|
import io.jsonwebtoken.*;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.io.IOException;
|
import java.security.NoSuchAlgorithmException;
|
import java.security.spec.InvalidKeySpecException;
|
import java.time.LocalDateTime;
|
|
/**
|
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
|
*
|
* @Description: Jwt 帮助类<br>
|
* @Project: <br>
|
* @CreateDate: Created in 2020/2/11 11:08 <br>
|
* @Author: <a href="4345453@kidgrow.com">liuke</a>
|
*/
|
@Slf4j
|
public class JwtHelper {
|
private static final RsaKeyHelper RSA_KEY_HELPER = new RsaKeyHelper();
|
|
/**
|
* 生成用户token
|
*
|
* @param jwtInfo
|
* @param priKeyPath
|
* @param expire
|
* @return
|
* @throws BizException
|
*/
|
public static Token generateUserToken(JwtUserInfo jwtInfo, String priKeyPath, int expire) throws BizException {
|
JwtBuilder jwtBuilder = Jwts.builder()
|
//设置主题
|
.setSubject(String.valueOf(jwtInfo.getUserId()))
|
.claim(BaseConstants.JWT_KEY_ACCOUNT, jwtInfo.getAccount())
|
.claim(BaseConstants.JWT_KEY_NAME, jwtInfo.getName())
|
.claim(BaseConstants.JWT_KEY_ORG_ID, jwtInfo.getOrgId())
|
.claim(BaseConstants.JWT_KEY_STATION_ID, jwtInfo.getStationId());
|
return generateToken(jwtBuilder, priKeyPath, expire);
|
}
|
|
/**
|
* 获取token中的用户信息
|
*
|
* @param token token
|
* @param pubKeyPath 公钥路径
|
* @return
|
* @throws Exception
|
*/
|
public static JwtUserInfo getJwtFromToken(String token, String pubKeyPath) throws BizException {
|
Jws<Claims> claimsJws = parserToken(token, pubKeyPath);
|
Claims body = claimsJws.getBody();
|
String strUserId = body.getSubject();
|
String account = StrHelper.getObjectValue(body.get(BaseConstants.JWT_KEY_ACCOUNT));
|
String name = StrHelper.getObjectValue(body.get(BaseConstants.JWT_KEY_NAME));
|
|
String strOrgId = StrHelper.getObjectValue(body.get(BaseConstants.JWT_KEY_ORG_ID));
|
String strDepartmentId = StrHelper.getObjectValue(body.get(BaseConstants.JWT_KEY_STATION_ID));
|
Long userId = NumberHelper.longValueOf0(strUserId);
|
Long orgId = NumberHelper.longValueOf0(strOrgId);
|
Long departmentId = NumberHelper.longValueOf0(strDepartmentId);
|
return new JwtUserInfo(userId, account, name, orgId, departmentId);
|
}
|
|
|
/**
|
* 生成token
|
*
|
* @param builder
|
* @param priKeyPath
|
* @param expire
|
* @return
|
* @throws BizException
|
*/
|
protected static Token generateToken(JwtBuilder builder, String priKeyPath, int expire) throws BizException {
|
try {
|
//返回的字符串便是我们的jwt串了
|
String compactJws = builder.setExpiration(DateUtils.localDateTime2Date(LocalDateTime.now().plusSeconds(expire)))
|
//设置算法(必须)
|
.signWith(SignatureAlgorithm.RS256, RSA_KEY_HELPER.getPrivateKey(priKeyPath))
|
//这个是全部设置完成后拼成jwt串的方法
|
.compact();
|
return new Token(compactJws, expire);
|
} catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) {
|
log.error("errcode:{}, message:{}", ExceptionCode.JWT_GEN_TOKEN_FAIL.getCode(), e.getMessage());
|
throw new BizException(ExceptionCode.JWT_GEN_TOKEN_FAIL.getCode(), ExceptionCode.JWT_GEN_TOKEN_FAIL.getMsg());
|
}
|
}
|
|
|
/**
|
* 公钥解析token
|
*
|
* @param token
|
* @param pubKeyPath 公钥路径
|
* @return
|
* @throws Exception
|
*/
|
private static Jws<Claims> parserToken(String token, String pubKeyPath) throws BizException {
|
try {
|
return Jwts.parser().setSigningKey(RSA_KEY_HELPER.getPublicKey(pubKeyPath)).parseClaimsJws(token);
|
} catch (ExpiredJwtException ex) {
|
//过期
|
throw new BizException(ExceptionCode.JWT_TOKEN_EXPIRED.getCode(), ExceptionCode.JWT_TOKEN_EXPIRED.getMsg());
|
} catch (SignatureException ex) {
|
//签名错误
|
throw new BizException(ExceptionCode.JWT_SIGNATURE.getCode(), ExceptionCode.JWT_SIGNATURE.getMsg());
|
} catch (IllegalArgumentException ex) {
|
//token 为空
|
throw new BizException(ExceptionCode.JWT_ILLEGAL_ARGUMENT.getCode(), ExceptionCode.JWT_ILLEGAL_ARGUMENT.getMsg());
|
} catch (Exception e) {
|
log.error("errcode:{}, message:{}", ExceptionCode.JWT_PARSER_TOKEN_FAIL.getCode(), e.getMessage());
|
throw new BizException(ExceptionCode.JWT_PARSER_TOKEN_FAIL.getCode(), ExceptionCode.JWT_PARSER_TOKEN_FAIL.getMsg());
|
}
|
}
|
}
|