package com.hx.util;
|
|
import java.util.Base64;
|
import java.util.Date;
|
|
import javax.crypto.SecretKey;
|
import javax.crypto.spec.SecretKeySpec;
|
|
import io.jsonwebtoken.Claims;
|
import io.jsonwebtoken.ExpiredJwtException;
|
import io.jsonwebtoken.JwtBuilder;
|
import io.jsonwebtoken.Jwts;
|
import io.jsonwebtoken.SignatureAlgorithm;
|
import io.jsonwebtoken.SignatureException;
|
|
/**
|
* 生成token (登录,或者其他)
|
* @author chenjiahe
|
* @Data 20200609
|
*/
|
public class JwtTool {
|
|
/**
|
* 签发JWT
|
* @param id 标识
|
* @param subject 可以是JSON数据 尽可能少
|
* @param ttlMillis 有效时间长度(秒),为空你认证时间
|
* @return String
|
*
|
*/
|
public static String createJWT(String id, String subject, long ttlMillis) {
|
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
|
long nowMillis = System.currentTimeMillis();
|
Date now = new Date(nowMillis);
|
SecretKey secretKey = generalKey();
|
JwtBuilder builder = Jwts.builder()
|
.setId(id)
|
.setSubject(subject) // 主题
|
.setIssuer("user") // 签发者
|
.setIssuedAt(now) // 签发时间
|
.signWith(signatureAlgorithm, secretKey); // 签名算法以及密匙
|
if (SimpleTool.checkNotNull(ttlMillis)&&ttlMillis >= 0) {
|
long expMillis = nowMillis + ttlMillis*1000;
|
Date expDate = new Date(expMillis);
|
builder.setExpiration(expDate); // 过期时间
|
}
|
return builder.compact();
|
}
|
/**
|
* 验证JWT
|
* @param jwtStr
|
* @return JwtConstant
|
*/
|
public static JwtConstant validateJWT(String jwtStr) {
|
JwtConstant checkResult = new JwtConstant();
|
Claims claims = null;
|
try {
|
claims = parseJWT(jwtStr);
|
checkResult.setSuccess(true);
|
checkResult.setClaims(claims);
|
} catch (ExpiredJwtException e) {
|
checkResult.setErrCode(JwtConstant.JWT_ERRCODE_EXPIRE);
|
checkResult.setSuccess(false);
|
} catch (SignatureException e) {
|
checkResult.setErrCode(JwtConstant.JWT_ERRCODE_FAIL);
|
checkResult.setSuccess(false);
|
} catch (Exception e) {
|
checkResult.setErrCode(JwtConstant.JWT_ERRCODE_FAIL);
|
checkResult.setSuccess(false);
|
}
|
return checkResult;
|
}
|
|
public static SecretKey generalKey() {
|
byte[] encodedKey = Base64.getDecoder().decode(JwtConstant.JWT_SECERT);
|
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
|
return key;
|
}
|
|
/**
|
*
|
* 解析JWT字符串
|
* @param jwt
|
* @return
|
* @throws Exception
|
*/
|
public static Claims parseJWT(String jwt) throws Exception {
|
SecretKey secretKey = generalKey();
|
return Jwts.parser()
|
.setSigningKey(secretKey)
|
.parseClaimsJws(jwt)
|
.getBody();
|
}
|
}
|