使用jjwt生成的token值,怎么解析明文不做过期校验处理??

发布于 2022-09-12 02:04:04 字数 629 浏览 18 评论 0

在springboot中使用的是jjwt做的token,但是我想添加一个刷新token的机制,就是过期后,只要没有超过允许的范围内,可以再次生成一个新的token已达到刷新token的目的。

但是在生成新的token时,我需要在旧的token中解析出一些用户信息,用来生成新的token。但是在解析的时候总是抛出过期异常,有没有什么方法可以设置jjwt解析的时候,不做过期的校验

 public  static  String   getRefreshToken(String token) throws ParseException {

        // 刷新token值
        Claims body = Jwts.parser()
                //设置签名的秘钥
                .setSigningKey(TOKENKEY)
                .parseClaimsJws(token)
                .getBody(); // 从旧的token中解析出用户信息用于新token的生成
        
       return "";

    }

有没有什么方法可以让 Jwts.parser() 在解析时不要再做过期校验了。否则总是抛出异常,没法获取用户信息

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

云巢 2022-09-19 02:04:04

你可以在老的 jwt 失效的前一段时间,生成新的 jwt 就可以了。

后端返回新的响应头 new-jwt,前端检测有该响应头,用该新值来替换本地老的 jwt
之后再做请求就是新的 jwt

谎言月老 2022-09-19 02:04:04

题主,你好,想要获取到payload,我觉得可以有以下两种方式,但是这两种方式的思考模式是不一样


jwt的定义出发

JWT官网的introduction中,我们不难发现,jwt是分3断的(headerpayload以及signature),而其中headerpayload最终结果都是经过Base64Url编码过的

这是header的说明
image.png

这是payload的说明
image.png

而我们所需要的信息那肯定在payload中,所以我们如果仅仅想要获取到实际的payload中的信息,我们是可以直接用Base64Url解码就可以了,从题主给的parseClaimsJws(token)方法入手我们也可以很快找到官方他们也是这样做的

DefaultJwtParser.parse292行
image.png

从异常处理出发

第三方jarexception况下,一般来说我们自己的业务系统都是需要去做一些exception处理的,无论是转换为业务exception抛出,还是说仅仅只是记录exception,我们会针对别人提供的exception来做定制的处理,而往往exception不仅仅是指明了当前exception场景,有时候还需要携带出当前exception相关的参数的

还是从DefaultJwtParser.parse出发,第411行,看到了过期校验抛出的是ExpiredJwtException
image.png

并且我们可以发现,抛出这个exception的构造参数是有claims的,查看API,发现有方法getClaims,恰好就是返回的claims
image.png

所以这就很简单了,我们只需要catchExpiredJwtException,然后e.getClaims就可以获取到我们想要的参数了

以上仅供参考~

执手闯天涯 2022-09-19 02:04:04

和我的实现方式几乎一样啊。贴一段代码自己试试吧,jwt就是生成的token。

    public Map parseJwtPayload(String jwt) {
        String base64UrlEncodedHeader = null;
        String base64UrlEncodedPayload = null;
        String base64UrlEncodedDigest = null;
        int delimiterCount = 0;
        StringBuilder sb = new StringBuilder(128);
        for (char c : jwt.toCharArray()) {
            if (c == '.') {
                CharSequence tokenSeq = io.jsonwebtoken.lang.Strings.clean(sb);
                String token = tokenSeq != null ? tokenSeq.toString() : null;

                if (delimiterCount == 0) {
                    base64UrlEncodedHeader = token;
                } else if (delimiterCount == 1) {
                    base64UrlEncodedPayload = token;
                }

                delimiterCount++;
                sb.setLength(0);
            } else {
                sb.append(c);
            }
        }
        if (delimiterCount != 2) {
            String msg = "JWT strings must contain exactly 2 period characters. Found: " + delimiterCount;
            throw new MalformedJwtException(msg);
        }
        if (sb.length() > 0) {
            base64UrlEncodedDigest = sb.toString();
        }
        if (base64UrlEncodedPayload == null) {
            throw new MalformedJwtException("JWT string '" + jwt + "' is missing a body/payload.");
        }
        // =============== Header =================
        Header header = null;
        CompressionCodec compressionCodec = null;
        if (base64UrlEncodedHeader != null) {
            String origValue = TextCodec.BASE64URL.decodeToString(base64UrlEncodedHeader);
            Map<String, Object> m = readValue(origValue);
            if (base64UrlEncodedDigest != null) {
                header = new DefaultJwsHeader(m);
            } else {
                header = new DefaultHeader(m);
            }
            compressionCodec = codecResolver.resolveCompressionCodec(header);
        }
        // =============== Body =================
        String payload;
        if (compressionCodec != null) {
            byte[] decompressed = compressionCodec.decompress(TextCodec.BASE64URL.decode(base64UrlEncodedPayload));
            payload = new String(decompressed, io.jsonwebtoken.lang.Strings.UTF_8);
        } else {
            payload = TextCodec.BASE64URL.decodeToString(base64UrlEncodedPayload);
        }
        JSONObject jsonObject = JSONObject.parseObject(payload);
        Map<String, Object> map = jsonObject;
        return map;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文