使用 passport-jwt 进行 JWT 身份验证不考虑到期日期
Posted
技术标签:
【中文标题】使用 passport-jwt 进行 JWT 身份验证不考虑到期日期【英文标题】:JWT authentication with passport-jwt does not take expiration date into account 【发布时间】:2021-09-25 15:27:52 【问题描述】:我正在尝试使用 Passport-jwt 和 jsonwebtoken 在 Express 中使用 JWT 令牌进行身份验证系统。现在一切正常,但即使我设置了过期日期,即使在该日期之后令牌仍然有效,如果我尝试将它与 Postman 一起使用,我无法弄清楚我错过了什么。 根据我的理解以及我在许多教程中看到的内容,过期日期应该由 passsport-jwt 本身处理,但是如果我尝试使用几天前生成的令牌,它仍然有效,即使我确实将持续时间设置为一天.这是我的代码:
//passport.jwt.ts
const publicKey: string = process.env.PUBLIC_KEY.replace(/\\n/g, "\n");
const options =
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: publicKey,
algorithms: ["RS256"],
;
const strategy = new JWTStrategy(options, async (payload, done) =>
const repo: UserRepository = RepoManager.getUserRepo();
try
const user: UserModel = await repo.getUserById(payload.sub);
if (user)
return done(null, user);
else
return done(null, false);
catch (error)
done(error);
);
export function JWTPassport(passport)
passport.use(strategy);
//register user middleware for the /register route
export async function registerUser(req, res)
try
const salt, hash = hashPassword(req.body.password);
const newUser =
username: req.body.username,
password: hash,
salt: salt,
email: req.body.email,
;
let model: UserModel = Deserialize(newUser);
const repo: UserRepository = RepoManager.getUserRepo();
model = await repo.createUser(model);
const jwt = issueJWT(model);
res.status(200).json( user: model, jwt: jwt );
catch (e)
res
.status(400)
.json( error: "could not register user" );
//function generating the JWT token
export function issueJWT(user: UserModel)
const id = user.id;
const expiresIn = "1d";
const payload =
sub: id,
iat: Date.now(),
;
const signedToken = sign(payload, privateKey,
expiresIn: expiresIn,
algorithm: "RS256",
);
return
token: "Bearer " + signedToken,
expires: expiresIn,
;
编辑:我发现了部分问题,时间戳是以毫秒而不是秒为单位生成的。现在我使用60 * 60 * 24
手动计算时间戳,但我想了解为什么使用语法"1d"
,因为它在文档中被推荐
【问题讨论】:
您希望令牌在多长时间内过期? 我还不知道,我只是放了 1 天的时间来测试……有关系吗? 【参考方案1】:在 issue Jwt 中试试这个
const signedToken = jwt.sign(payload, privateKey,
expiresIn: "1h",
algorithm: "RS256",
);
【讨论】:
这就是我正在做的,但是用一个变量而不是一个字符串值......你认为这会有所不同吗? 你试过了吗? 我不明白为什么,现在连我的代码都可以工作了。我唯一改变的是,我还以秒而不是毫秒转换了 iat。我真的不明白发生了什么,但现在一切正常 也许它以前也可以工作。更改字符串或变量不是我的意图。我将符号更改为 jwt.sign。我认为它可能会工作以上是关于使用 passport-jwt 进行 JWT 身份验证不考虑到期日期的主要内容,如果未能解决你的问题,请参考以下文章
使用passport-jwt在nestJs框架中进行角色验证