【问题标题】:jwt.verify not throwing error for expired tokensjwt.verify 不会为过期令牌抛出错误
【发布时间】:2020-11-27 03:54:43
【问题描述】:

我在 Nodejs 中使用 JWT - 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 分钟后也不会过期。

我怎样才能做到这一点?

谢谢

【问题讨论】:

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


【解决方案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 * 天) 表示分钟、小时或天。

expiresIn 可以用作符号方法的一个选项,如 Shivam Soods 回答中所示。我想这就是你困惑的原因。

【讨论】:

  • 错误。取自here --- expiresIn: expressed in seconds or a string describing a time span zeit/ms. Eg: 60, "2 days", "10h", "7d". A numeric value is interpreted as a seconds count. If you use a string be sure you provide the time units (days, hours, etc), otherwise milliseconds unit is used by default ("120" is equal to "120ms").
  • OP 直接在负载中编码expiresIn。它没有任何意义。您正在阅读的内容以及 Shivam Sood 在他的回答中所写的是符号函数的参数,这是一个区别
  • 很公平。我必须承认我忽略了这一点。
  • 没错,这就是为什么我在 OP 阅读的答案中添加了文档的链接,希望她能更好地理解。
  • @PrachiSharma + (60 * minutes),或+ (3600 * hours)+ (86400 * days)
【解决方案2】:

如果您想使用expiresIn 使用hoursminutes,您需要像这样在secret 之后声明它

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

阅读更多关于它的信息here

【讨论】:

  • 这给了我Error: invalid expiresIn option for string payload的错误
  • @PrachiSharma 想知道出了什么问题,它应该可以工作,另请参阅链接文档。
  • @PrachiSharma 那是因为您的有效负载是一个字符串。您不能在字符串有效负载上使用 expiresIn。将您的有效负载更改为{ foo: "bar" } 之类的东西,它应该可以工作。 See here for more info
  • 是的,我也浏览过文档
  • 好的。我让它使用var token = jwt.sign({ data: 'an id' }, 'mysecretkey', { expiresIn: '2m' })
猜你喜欢
  • 2020-10-12
  • 1970-01-01
  • 2019-10-02
  • 2016-08-04
  • 1970-01-01
  • 2014-06-30
  • 2011-11-29
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多