当前位置: 首页 > 知识库问答 >
问题:

提取过期jwt令牌的有效负载

廖弘伟
2023-03-14

我使API服务器与Node.js和快递。

我还为auth用户使用了JWT令牌身份验证。

如果令牌过期,我的场景就在这里。

>

  • (后端)中间件检测过期

    (前端)接收令牌已过期

    (前端)刷新后端令牌请求

    (后端)验证令牌是否有效,如果已过期,则对新令牌(使用旧令牌的有效负载)进行签名,并将其响应到前端

    在第4位,我的代码在这里。

    try {
        const token = req.headers.authorization.split(' ')[1];
        jwt.verify(token, SECRET, (err, decoded) => {
            if(err.name === 'TokenExpiredError') {
                const payload = jwt.verify(token, SECRET);
                const userid = payload.userid;
                const is_admin = payload.is_admin;
    
                const refreshToken = jwt.sign({
                    userid: userid,
                    is_admin: is_admin
                }, SECRET, {
                    algorithm: 'HS256',
                    expiresIn: '10m'
                })
                res.status(200).json({status: true, token: refreshToken});
            }
            else if(err) {
                res.status(401).json({status: false, result: "Invalid token"});
            }
        })
    } catch(e) {
        //console.log(e);
        res.status(401).json({status: false, result: "Token does not exist"});
    }
    

    运行后,抛出错误行const payload=jwt.verify(令牌,SECRET);

    因为如果令牌过期,它会抛出令牌过期错误。

    我想解码令牌并提取过期令牌的有效负载。

    但是在verify()中,没有关于有效负载的信息。

    所以我读了文件,找到了一些有趣的方法。

    但它提到不要使用decode(),因为它不会检查签名是否正确。

    对于提取过期令牌的有效负载,有什么解决方案吗?

    谢谢。

  • 共有1个答案

    邹弘
    2023-03-14

    您可以将选项ignoreExpiration设置为true,以避免过期令牌出现此错误(此时您已经知道了),然后获取有效负载:

    if(err.name === 'TokenExpiredError') {
        const payload = jwt.verify(token, SECRET, {ignoreExpiration: true} );
        // your code
    }
    

    现在您可以确定令牌有效但刚刚过期。

     类似资料:
    • 那么有人能告诉我如何避免这种情况吗?

    • 我使用了一个JWT(Json Web令牌),它在负载中有一个刷新令牌(GUID)。通常,我使用Firebase JWT创建/编码和解码JWT。 我想在PHP中解码一个过期的JWT,然后使用其负载中的刷新令牌创建一个新的JWT(只要刷新令牌仍然有效)。如果我用Firebase解码JWT,它会抛出一个异常(过期),并且不会返回解码后的令牌。 如何安全地解码过期的JWT并访问它的有效负载?我可以只捕获过

    • 我在Spring Boot中创建了一个JWT令牌,用于存储用户详细信息。当我使用Jwttokenutil时。getUsernameFromToken(authToken)[authToken是传递的令牌]方法我将数据集获取给Subject。类似地,我希望将包含其他用户详细信息的数据集获取到Payload。但是我不能得到它。 ======下面是我的令牌生成方法/代码:======== =======

    • 问题内容: 我想对我们的新REST API实施基于JWT的身份验证。但是,由于在令牌中设置了有效期,是否可以自动延长有效期?我不希望用户在此期间正在使用该应用程序的情况下,每隔X分钟登录一次。那将是巨大的用户体验失败。 但是,延长有效期将创建一个新令牌(旧令牌在过期之前仍然有效)。在每个请求之后生成一个新令牌对我来说听起来很愚蠢。当多个令牌同时有效时,听起来像一个安全问题。当然,我可以使用黑名单来

    • 我想用当前的方法加密JWT负载,比如对称或非对称加密方法。我的问题是,如果我使用这些方法,javascript需要在客户端对我的数据执行任何操作?还是加密和验证的所有部分都将在服务器端完成?在本文中,他们说,如果需要加密负载,则必须存储公钥(由于RSA或…)等加密算法的缘故)。为什么?如果我需要加密有效负载,为什么我们需要在jwt令牌中存储公钥(或任何密钥)?有没有办法只在服务器端对称加密有效负载

    • null 我目前拥有的是以下内容:当密码哈希和用户名在数据库中匹配时,刷新令牌endpoint生成一个JWT。每个刷新令牌都有一个存储在数据库中的jti,以及过期(仅用于DB清理)、device_id和一个revoked标志。可以使用refresh令牌命中另一个endpoint,该令牌返回一个JWT访问令牌。访问令牌的有效期为15分钟。无法吊销访问令牌。 我的问题出现在需求1上。我不希望用户在与网