[英]Nodejs jwt token never expires
我使用 jsonwebtoken 創建 jwt 令牌。 我將令牌設置為在 5 分鍾后過期以進行檢查,但令牌永不過期,我總是同時獲得iat
和exp
,如下面的日志:
{
sub: '10001',
iat: 1627452909247,
exp: 1627452909547
}
Issue at time: 7/28/2021, 1:15:09 PM | 1627452909247
Expire at time: 7/28/2021, 1:15:09 PM | 1627452909547
以下是我的問題代碼和驗證令牌:
const crypto = require('crypto');
const path = require('path');
const fs = require('fs');
const jwt = require('jsonwebtoken');
// Public Key
const pathToPublicKey = path.join( __dirname , ".." ,"/id_rsa_pub.pem");
const publicKey = fs.readFileSync(pathToPublicKey , "utf8");
// Private Key
const pathToPrivateKey = path.join( __dirname , ".." ,"/id_rsa_priv.pem");
const privateKey = fs.readFileSync(pathToPrivateKey , "utf8");
//const expiresIn = '5';
const expiresIn = '5m';
//const expiresIn = '1h';
//const expiresIn = '1d';
const issueJWT = (user) => {
const user_id = user.user_id;
const payload = {
sub: user_id,
iat: Date.now()
};
const jwtOptions = {
expiresIn: expiresIn,
algorithm: 'RS256'
};
const signedToken = jwt.sign(payload, privateKey, jwtOptions);
return{
token: "Bearer " + signedToken,
expires: expiresIn,
};
};
const authMiddleware = (req, res, next) => {
const tokenParts = req.headers.authorization.split(" ");
const jwtOptions = {
expiresIn: expiresIn,
algorithms: ['RS256']
};
if(tokenParts[0] === "Bearer" && tokenParts[1].match(/\S+\.\S+\.\S+/) !== null)
{
try {
const verification =jwt.verify(tokenParts[1], publicKey, jwtOptions);
req.jwt = verification ;
next();
} catch (error) {
res.status(401).json({succsess: false , message: 'User Not Authenticated'});
}
}
}
module.exports = { issueJWT, authMiddleware};
我嘗試了很多方法,但仍然無法正常工作。
時間戳是錯誤的。 在https://jwt.io 中檢查您的令牌並用鼠標指向時間戳以查看如何解釋這些值。
JWT 中的時間戳是 UNIX 時間戳,從 01.01.1970 00:00 UTC 算起,以秒為單位,而不是毫秒(有關更多詳細信息,請參閱我的回答)。
過期時間exp
設置方式
const expiresIn = '5m';
const jwtOptions = {
expiresIn: expiresIn,
algorithms: ['RS256']
};
const signedToken = jwt.sign(payload, privateKey, jwtOptions);
是正確的,如果您刪除行iat: Date.now()
您將獲得正確的標記,即使使用iat
,因為該值已自動包含在內。
{
"iat": 1627506023,
"exp": 1627506323
}
但是如果包含了iat: Date.now()
行,它不僅會產生錯誤的iat
而且exp
計算為iat
+ 300(300 秒或 5 分鍾),而且也會是錯誤的。
{
"iat": 1627506191289,
"exp": 1627506191589
}
解決方案是簡單地從代碼中刪除iat: Date.now()
行。 如果您確實需要一個基於Date.now()
計算的正確格式的時間戳,您必須將值除以 1000 並Date.now()
小數點,例如:
nbf: Math.floor(Date.now()/1000)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.