簡體   English   中英

jwt.verify 不會為過期令牌拋出錯誤

[英]jwt.verify not throwing error for expired tokens

我在 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 分鍾后也不會過期。

我怎樣才能做到這一點?

在您的代碼中,您添加了expiresIn作為有效負載的一部分。 但是expiresIn沒有意義,你需要使用標准的exp聲明來過期:

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

在本例中為 2 分鍾。 您還可以計算:(60 * 分鍾)、(3600 * 小時) 或 (86400 * 天) 的分鍾、小時或天數。

expiresIn可以用作 sign 方法的一個選項,如 Shivam Soods 回答中所示。 我想這就是你困惑的原因。

如果您想使用expiresIn處理hoursminutes ,您需要像這樣在您的secret之后聲明它

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

在此處閱讀有關它的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM