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

Posted

技术标签:

【中文标题】提取过期 jwt 令牌的有效负载【英文标题】:extract payload of expired jwt token 【发布时间】:2018-12-19 05:54:45 【问题描述】:

我正在使用 Node.js 和 Express 制作 API 服务器。

我还为 auth 用户使用了 JWT 令牌认证。

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

    (Backend) Middleware detect expired

    (Frontend) Receive token is expired

    (Fronend) Refresh token request to backend

    (Backend) Verify token is valid and if it expired, sign new token(with old token's payload) and response it to frontend

在第 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(token, SECRET);的错误行。

因为如果token过期了,会抛出TokenExpiredError错误。

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

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

于是我阅读了文档,发现了一些兴趣方法decode()

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

有没有关于提取过期令牌有效载荷的解决方案?

谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

只是出于好奇,如果我可以使用ignoreExpiration获取有效负载,那么为JWT设置过期时间有什么用.. @ShenPrabu 我有同样的问题,但我认为可以访问检查或获取隐藏在令牌中的信息,例如在我的情况下,在触发注销按钮时取回用户名并避免令牌过期时返回错误。

以上是关于提取过期 jwt 令牌的有效负载的主要内容,如果未能解决你的问题,请参考以下文章

PHP JWT:: **解码** 过期令牌

Spring Boot 安全性 - 允许使用过期 JWT 令牌的用户请求

当 jwt 刷新令牌未过期时,React Native 应用程序注销

新的 JWT 令牌与旧令牌的有效期相同

如果存储在本地存储中,检查 jwt 令牌过期状态的最佳方法

JWT/Laravel 延长令牌有效期