com.nimbusds nimbus-jose-jwt compile 8.20.1 和 io.jsonwebtoken jjwt 0.9.1 两家jwt都用过了 之前用的是jjwt的当时配合springboor security,使用过几次后有了一些感悟
token最终目的也只是标识,至于token中是否携带真实有效的用户信息根本不重要,
jwt库只有两个作用,一个是验证一个tonke是否是所属应用发放的,另一个是加入用户信息,但是这个不重要
我们甚至可以用用户的id去做token但是,非法用户可能随意尝试一段id就能做token,那如果用id经过简单的加密得到另外的字符串发放去除做token,或者再高级一点,把得到的字符串为key,再把用户信息为value,限时保存在redis中,这样不就又能限制时间,以及记录用户信息吗?
这两个工具人是下面的
@Bean(name = "HmacSigner")
public JWSSigner generateHmacJwsSigner() throws KeyLengthException {
SecureRandom random = new SecureRandom();
random.nextBytes(sharedSecret.getBytes());
return new MACSigner(sharedSecret);
}
@Bean(name = "HmacVerifier")
public JWSVerifier getHmacJwsVerifier() throws JOSEException {
SecureRandom random = new SecureRandom();
random.nextBytes(sharedSecret.getBytes());
return new MACVerifier(sharedSecret);
}
今天使用nimbus-jose-jwt,发现一个小细节
JSONObject object=new JSONObject();
object.put("arg1",xxx)
object.put("arg2",xxx)
object.put("arg2",xxx)
Payload payload = new Payload(object.toJSONString());
JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT).build();//jwsheader不论那种都需要的
JWSObject jwsObject = new JWSObject(jwsHeader,payload);
jwsObject.sign(hmacSigner);//签名
String token = jwsObject.serialize();
JWSObject jwsObject = JWSObject.parse(token);
if(!jwsObject.verify(macVerifier)) {throw new JwtSignatureVerifyException("Sign fail!");}
// 获取有效负载
Payload payload = jwsObject.getPayload(); // 有效负载JSON字符串
JSONObject json=JSONObject.parse(payload.toString())
后面根据json来验证试过时间过期,啥的
这种就只是用jwt库判断是否官方发放
JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT).build();
JWTClaimsSet.Builder jwtClaimsSet= new JWTClaimsSet.Builder();
jwtClaimsSet.claim(key1,v1)
jwtClaimsSet.claim(key2,v2)
jwtClaimsSet.claim(key3,v3)
标准中注册的声明 (建议但不强制使用) :
百度得到jwt各个参数
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
SignedJWT signedJWT = new SignedJWT(jwsHeader,jwtClaimsSet.build());
signedJWT.sign(hmacSigner);
String token=signedJWT.serialize();
用JWTClaimsSet对象设置好过期时间,那么就是这样
SignedJWT parse = SignedJWT.parse(token);
if (!parse.verify(hmacVerifier)) {//自己会验证是否官方和时间过期
throw new RuntimeException("invalid token");
}
parse.getJWTClaimsSet().getClaim("key")
parse.getJWTClaimsSet().getClaim("key2")
parse.getJWTClaimsSet().getClaim("key3")
最后我们得到结论用啥库不重要,用啥方式也不重要,关键是谁性能好,就用谁
自己随便发放字符串也能做token,只要能验证是否是官方方法就行。