JWT tonken的使用和感悟

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,只要能验证是否是官方方法就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值