Nodejs jwt 令牌永不过期
Posted
技术标签:
【中文标题】Nodejs jwt 令牌永不过期【英文标题】:Nodejs jwt token never expires 【发布时间】:2021-10-03 22:12:16 【问题描述】:我使用 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;
试了很多方法还是不行。
【问题讨论】:
【参考方案1】:时间戳错误。检查https://jwt.io 中的令牌并用鼠标指向时间戳以查看这些值是如何解释的。
JWT 中的时间戳是从 01.01.1970 00:00 UTC 算起的 UNIX 时间戳,而不是毫秒(有关详细信息,请参阅 my answer)。
过期时间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 并去除小数,例如:
nbf: Math.floor(Date.now()/1000)
【讨论】:
以上是关于Nodejs jwt 令牌永不过期的主要内容,如果未能解决你的问题,请参考以下文章
当用户在nodeJS / Express和Angular中空闲一段时间(基于令牌的授权)时,我如何使我的JWT令牌过期