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

时间:2018-07-11 08:57:40

标签: node.js jwt

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

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

如果令牌已过期,那么我的情况就在这里。

  1. .highcharts-partfill-original { height: 100%; }

  2. (Backend) Middleware detect expired

  3. (Frontend) Receive token is expired

  4. (Fronend) Refresh token request to backend

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

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

运行它后,抛出错误行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);错误。

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

但是在TokenExpiredError中,没有有关有效负载的信息。

因此,我阅读了文档,找到了一些感兴趣的方法verify()

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

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

谢谢。

1 个答案:

答案 0 :(得分:5)

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

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

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