使用 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 身份验证

我可以有条件地使用passport-jwt吗?

使用passport-jwt在nestJs框架中进行角色验证

passport-jwt,不抛错误,但不认证。甚至不会console.log

无法使用 passport-jwt 访问受保护的路线

使用不同的用户角色在passport-jwt中设置身份验证很热门?