|
|
|
@ -1,212 +1,79 @@ |
|
|
|
package cn.chjyj.szwh.utils; |
|
|
|
|
|
|
|
import io.jsonwebtoken.Claims; |
|
|
|
import io.jsonwebtoken.CompressionCodecs; |
|
|
|
import io.jsonwebtoken.JwtBuilder; |
|
|
|
import io.jsonwebtoken.Jwts; |
|
|
|
import io.jsonwebtoken.SignatureAlgorithm; |
|
|
|
|
|
|
|
import cn.chjyj.szwh.exception.ChException; |
|
|
|
import com.auth0.jwt.JWT; |
|
|
|
import com.auth0.jwt.JWTVerifier; |
|
|
|
import com.auth0.jwt.algorithms.Algorithm; |
|
|
|
import com.auth0.jwt.exceptions.JWTDecodeException; |
|
|
|
import com.auth0.jwt.interfaces.Claim; |
|
|
|
import com.auth0.jwt.interfaces.DecodedJWT; |
|
|
|
|
|
|
|
import java.util.Calendar; |
|
|
|
import java.util.Date; |
|
|
|
|
|
|
|
/** |
|
|
|
* jwt工具类 |
|
|
|
*/ |
|
|
|
public class JwtUtils { |
|
|
|
/** |
|
|
|
* 实例 |
|
|
|
*/ |
|
|
|
private static JwtUtils instance; |
|
|
|
|
|
|
|
/** |
|
|
|
* 发行者 |
|
|
|
*/ |
|
|
|
private String subObject = "owner"; |
|
|
|
|
|
|
|
/** |
|
|
|
* 过期时间,默认7天 |
|
|
|
* 签发对象:这个用户的id |
|
|
|
* 签发时间:现在 |
|
|
|
* 有效时间:30分钟 |
|
|
|
* 载荷内容:暂时设计为:这个人的名字,这个人的昵称 |
|
|
|
* 加密密钥:这个人的id加上一串字符串 |
|
|
|
*/ |
|
|
|
private long expired = 1000 * 60 * 60 * 24 * 7; |
|
|
|
|
|
|
|
/** |
|
|
|
* jwt构造 |
|
|
|
*/ |
|
|
|
private static JwtBuilder jwtBuilder; |
|
|
|
|
|
|
|
/** |
|
|
|
* 密钥 |
|
|
|
*/ |
|
|
|
private String secret = "secret";// 密钥
|
|
|
|
|
|
|
|
/** |
|
|
|
* 获取实例 |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public static JwtUtils getInstance(){ |
|
|
|
if (instance == null){ |
|
|
|
instance = new JwtUtils(); |
|
|
|
} |
|
|
|
jwtBuilder = Jwts.builder(); |
|
|
|
return instance; |
|
|
|
public static String createToken(String userId, String realName, String userName) { |
|
|
|
|
|
|
|
Calendar nowTime = Calendar.getInstance(); |
|
|
|
nowTime.add(Calendar.MINUTE, 30); |
|
|
|
Date expiresDate = nowTime.getTime(); |
|
|
|
|
|
|
|
return JWT.create().withAudience(userId) //签发对象
|
|
|
|
.withIssuedAt(new Date()) //发行时间
|
|
|
|
.withExpiresAt(expiresDate) //有效时间
|
|
|
|
.withClaim("userName", userName) //载荷,随便写几个都可以
|
|
|
|
.withClaim("realName", realName) |
|
|
|
.sign(Algorithm.HMAC256(userId + "HelloLehr")); //加密
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 荷载信息(通常是一个User信息,还包括一些其他的元数据) |
|
|
|
* @param key |
|
|
|
* @param val |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public JwtUtils setClaim(String key,Object val){ |
|
|
|
jwtBuilder.claim(key,val); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 生成 jwt token |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public String generateToken(){ |
|
|
|
String token = jwtBuilder |
|
|
|
.setSubject(subObject) // 发行者
|
|
|
|
//.claim("id","121") // 参数
|
|
|
|
.setIssuedAt(new Date()) // 发行时间
|
|
|
|
.setExpiration(new Date(System.currentTimeMillis() + expired)) |
|
|
|
.signWith(SignatureAlgorithm.HS256,secret) // 签名类型 与 密钥
|
|
|
|
.compressWith(CompressionCodecs.DEFLATE)// 对载荷进行压缩
|
|
|
|
.compact(); // 压缩一下
|
|
|
|
return token; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 解析 token |
|
|
|
* 检验合法性,其中secret参数就应该传入的是用户的id |
|
|
|
* |
|
|
|
* @param token |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public Claims check(String token){ |
|
|
|
try{ |
|
|
|
final Claims claims = Jwts.parser() |
|
|
|
.setSigningKey(secret) |
|
|
|
.parseClaimsJws(token) |
|
|
|
.getBody(); |
|
|
|
return claims; |
|
|
|
}catch (Exception e){} |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
public String getSubObject() { |
|
|
|
return subObject; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置发行者 |
|
|
|
* @param subObject |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public JwtUtils setSubObject(String subObject) { |
|
|
|
this.subObject = subObject; |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
public long getExpired() { |
|
|
|
return expired; |
|
|
|
public static void verifyToken(String token, String secret) { |
|
|
|
DecodedJWT jwt = null; |
|
|
|
try { |
|
|
|
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret + "HelloLehr")).build(); |
|
|
|
jwt = verifier.verify(token); |
|
|
|
} catch (Exception e) { |
|
|
|
//效验失败
|
|
|
|
//这里抛出的异常是我自定义的一个异常,你也可以写成别的
|
|
|
|
throw new ChException("token验证失败"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置过期时间 |
|
|
|
* @param expired |
|
|
|
* @return |
|
|
|
* 获取签发对象 |
|
|
|
*/ |
|
|
|
public JwtUtils setExpired(long expired) { |
|
|
|
this.expired = expired; |
|
|
|
return this; |
|
|
|
public static String getAudience(String token) { |
|
|
|
String audience = null; |
|
|
|
try { |
|
|
|
audience = JWT.decode(token).getAudience().get(0); |
|
|
|
} catch (JWTDecodeException j) { |
|
|
|
//这里是token解析失败
|
|
|
|
throw new ChException("token解析失败"); |
|
|
|
} |
|
|
|
return audience; |
|
|
|
} |
|
|
|
|
|
|
|
public String getSecret() { |
|
|
|
return secret; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置密钥 |
|
|
|
* @param secret |
|
|
|
* @return |
|
|
|
* 通过载荷名字获取载荷的值 |
|
|
|
*/ |
|
|
|
public JwtUtils setSecret(String secret) { |
|
|
|
this.secret = secret; |
|
|
|
return this; |
|
|
|
public static Claim getClaimByName(String token, String name) { |
|
|
|
return JWT.decode(token).getClaim(name); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// import com.auth0.jwt.JWT;
|
|
|
|
// import com.auth0.jwt.JWTVerifier;
|
|
|
|
// import com.auth0.jwt.algorithms.Algorithm;
|
|
|
|
// import com.auth0.jwt.exceptions.JWTDecodeException;
|
|
|
|
// import com.auth0.jwt.interfaces.Claim;
|
|
|
|
// import com.auth0.jwt.interfaces.DecodedJWT;
|
|
|
|
//
|
|
|
|
// import java.io.Serializable;
|
|
|
|
// import java.util.Calendar;
|
|
|
|
// import java.util.Date;
|
|
|
|
//
|
|
|
|
|
|
|
|
//public class JwtUtils {
|
|
|
|
//
|
|
|
|
// /**
|
|
|
|
// 签发对象:这个用户的id
|
|
|
|
// 签发时间:现在
|
|
|
|
// 有效时间:30分钟
|
|
|
|
// 载荷内容:暂时设计为:这个人的名字,这个人的昵称
|
|
|
|
// 加密密钥:这个人的id加上一串字符串
|
|
|
|
// */
|
|
|
|
// public static String createToken(String userId,String realName, String userName) {
|
|
|
|
//
|
|
|
|
// Calendar nowTime = Calendar.getInstance();
|
|
|
|
// nowTime.add(Calendar.MINUTE,30);
|
|
|
|
// Date expiresDate = nowTime.getTime();
|
|
|
|
//
|
|
|
|
// return JWT.create().withAudience(userId) //签发对象
|
|
|
|
// .withIssuedAt(new Date()) //发行时间
|
|
|
|
// .withExpiresAt(expiresDate) //有效时间
|
|
|
|
// .withClaim("userName", userName) //载荷,随便写几个都可以
|
|
|
|
// .withClaim("realName", realName)
|
|
|
|
// .sign(Algorithm.HMAC256(userId+"HelloLehr")); //加密
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// /**
|
|
|
|
// * 检验合法性,其中secret参数就应该传入的是用户的id
|
|
|
|
// * @param token
|
|
|
|
// * @throws TokenUnavailable
|
|
|
|
// */
|
|
|
|
// public static void verifyToken(String token, String secret) throws TokenUnavailable {
|
|
|
|
// DecodedJWT jwt = null;
|
|
|
|
// try {
|
|
|
|
// JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret+"HelloLehr")).build();
|
|
|
|
// jwt = verifier.verify(token);
|
|
|
|
// } catch (Exception e) {
|
|
|
|
// //效验失败
|
|
|
|
// //这里抛出的异常是我自定义的一个异常,你也可以写成别的
|
|
|
|
// throw new TokenUnavailable();
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// /**
|
|
|
|
// * 获取签发对象
|
|
|
|
// */
|
|
|
|
// public static String getAudience(String token) throws TokenUnavailable {
|
|
|
|
// String audience = null;
|
|
|
|
// try {
|
|
|
|
// audience = JWT.decode(token).getAudience().get(0);
|
|
|
|
// } catch (JWTDecodeException j) {
|
|
|
|
// //这里是token解析失败
|
|
|
|
// throw new TokenUnavailable();
|
|
|
|
// }
|
|
|
|
// return audience;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// /**
|
|
|
|
// * 通过载荷名字获取载荷的值
|
|
|
|
// */
|
|
|
|
// public static Claim getClaimByName(String token, String name){
|
|
|
|
// return JWT.decode(token).getClaim(name);
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
|