PassportJS 验证过期的 JWT

我的问题的症结在于PassportJS 似乎正在验证一个 JWT,它应该是无效的,因为当前时间超过了 exp 参数。


我已经提供了相关的代码片段和我认为应该发生的事情的解释(尽管它显然不是!!)


编码

// In server.js

// ...

const passport = require("passport");

// ...


require("./config/passport")(passport);

app.use(passport.initialize());


// ...

// In token.js (used to issue JWT)

const jsonwebtoken = require("jsonwebtoken");

// ...


const issueJWT = (user) => {

  const _id = user._id;

  const expiresIn = 30000; // 30s for testing purposes

  const payload = {

    sub: _id,

    iat: Date.now(),

  };


  const signedToken = jsonwebtoken.sign(payload, PRIV_KEY, {

    expiresIn: expiresIn,

    algorithm: "RS256",

  });


  return {

    token: "Bearer " + signedToken,

    expires: expiresIn,

  };

};

// In passport.js

const JwtStrategy = require("passport-jwt").Strategy;

const ExtractJwt = require("passport-jwt").ExtractJwt;

// ...


const options = {

  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),

  secretOrKey: PUB_KEY,

  algorithms: ["RS256"],

};


module.exports = (passport) => {

  passport.use(

    new JwtStrategy(options, (jwt_payload, done) => {

      User.findOne({ _id: jwt_payload.sub }, (err, user) => {

        if (err) {

          return done(err, false);

        }

        if (user) {

          return done(null, user);

        } else {

          return done(null, false);

        }

      });

    })

  );

};


我期望发生的事情

  1. 客户端使用身份验证标头中的承载令牌 (JWT) 向 /authenticate-with-access-token 发送 GET 请求

  2. PassportJS(通过jsonwebtoken.verify())尝试验证 JWT,但发现Date.now()超过了 JWT 的过期时间

  3. PassportJS 引发错误,使用 401 Unauthorized 响应解决请求

会发生什么

  1. 客户端使用身份验证标头中的承载令牌 (JWT) 向 /authenticate-with-access-token 发送 GET 请求

  2. PassportJS 将用户对象传入请求体并调用next()

  3. 最后一个中间件运行,使用 200 OK 响应解析请求,并通过 JSON 正文传回用户详细信息

我确定我错过了一些明显的东西,但对于我的生活,我无法弄清楚发生了什么。提前感谢您的帮助!


MYYA
浏览 93回答 2
2回答

红颜莎娜

好的,所以我想通了!事实证明(通过查看 jsonwebtoken 文档上的示例)签署令牌时使用的 iat 属性应该以秒为单位而不是毫秒。因此,Date.now()在 tokens.js 实际上应该是Math.floor(Date.now / 1000):// In token.js (used to issue JWT)const jsonwebtoken = require("jsonwebtoken");// ...const issueJWT = (user) => {  const _id = user._id;  const expiresIn = 30; // 30s for testing purposes  const payload = {    sub: _id,    iat: Math.floor(Date.now() / 1000),  };  const signedToken = jsonwebtoken.sign(payload, PRIV_KEY, {    expiresIn: expiresIn,    algorithm: "RS256",  });  return {    token: "Bearer " + signedToken,    expires: expiresIn,  };};

有只小跳蛙

我认为您应该在对象中设置Maxage令牌jwt的 ,options因为护照正在使用jsonwebtoken模块验证令牌,而且如果您将ignoreExpiration选项设置为 true 护照将不会验证令牌的过期,我知道情况并非如此,因为我可以'在你的代码中看不到它,但我最好的猜测是你必须Maxage像这样设置你的选项{ expiresIn: '1h' }从文档jsonWebTokenOptions:passport-jwt 正在使用 jsonwebtoken 验证令牌。在此处为您可以传递 jsonwebtoken 验证程序的任何其他选项传递一个选项对象。(即maxAge)如果您想了解有关jsonwebtoken的更多信息
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript