jwt.verify不会为过期的令牌抛出错误

时间:2020-08-06 20:16:47

标签: javascript node.js express jwt jwt-auth

我正在使用JWT-Node.js中的jsonwebtokens。

我正在创建一个令牌,如果令牌过期,我想抛出一个错误。我的令牌已成功创建,并且我正在Expressjs中的Apis中间件中检查令牌到期。然后从Angular的标头中发送令牌,并在中间件中检查到期时间。

这是我创建令牌的方式:

var token = jwt.sign({
                id: id,
                expiresIn: '2m'
            },
                'mysecretkey'
            );

这是我的中间件的外观:

var token = req.headers['authorization']
var idToken = token.split(' ')[1]
if(token) {
    jwt.verify(idToken, 'myscretkey', (err, decoded) => {
    if(err) {
         return res.status(400).send('Session expired')
    }
    next()    
    })    
}

这是我在decoded中收到的信息:

dec:  {
  id: 'an id',
  expiresIn: '2m',
  iat: 1596744770
}

在这种情况下,即使过了2分钟,我的令牌也没有过期。

我该如何实现?

谢谢

2 个答案:

答案 0 :(得分:2)

如果您想使用hours使用minutesexpiresIn,则需要像这样在secret之后声明它

let token = jwt.sign(id,'mysecretkey',{ expiresIn: '1h'});

详细了解here

答案 1 :(得分:1)

在代码中,您添加了expiresIn作为有效负载的一部分。但是,expiresIn毫无意义,您需要使用标准的expclaim来使其过期:

jwt.sign({
  id: 'an id',
  exp: Math.floor(Date.now() / 1000) + (60 * 2),
  iat: Math.floor(Date.now())
}, 'secret')

在此示例中为2分钟。 您还可以计算: (60 *分钟),(3600 *小时)或(86400 *天)持续数分钟,数小时或数天。

如Shivam Soods答案所示,

expiresIn可以用作符号方法的选项。我认为这就是您感到困惑的原因。