【问题标题】:PassportJS Validates Expired JWTPassportJS 验证过期的 JWT
【发布时间】:2020-10-17 23:38:17
【问题描述】:

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

我已经提供了相关的代码 sn-ps 和我认为应该发生的事情的解释(虽然它显然不是!!)

代码

// 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);
        }
      });
    })
  );
};
// In routes.js
// ...
const passport = require("passport");
const { authenticateWithAccessToken } = require("../controllers/usersController");
// ...
router
  .route("/authenticate-with-access-token")
  .get(
    passport.authenticate("jwt", { session: false }),
    authenticateWithAccessToken
  );
// In usersController.js
exports.authenticateWithAccessToken = async (req, res, next) => {
  try {
    const user = req.user;

    res.status(200).json({
      success: true,
      name: user.name,
      email: user.email,
    });
  } catch (err) {
    next(err);
  }
};

样本负载

{
 alg: "RS256",
 typ: "JWT"
}.
{
 sub: "5eec9f1c4a416c1e50fc0a8e", // user._id
 iat: 1593258411458,              // 2020-06-27 11:46:51
 exp: 1593258441458               // 2020-06-27 11:47:21
}.
[signature]

我预计会发生什么

  1. 客户端向 /authenticate-with-access-token 发送 GET 请求,并在 auth 标头中使用 Bearer 令牌 (JWT)
  2. PassportJS(通过 jsonwebtoken.verify())尝试验证 JWT,但发现 Date.now() 超过了 JWT 的有效期
  3. PassportJS 引发错误,使用 401 Unauthorized 响应解决请求

发生了什么

  1. 客户端向 /authenticate-with-access-token 发送 GET 请求,并在 auth 标头中使用 Bearer 令牌 (JWT)
  2. PassportJS 将用户对象传入请求体并调用next()
  3. 最后一块中间件运行,使用 200 OK 响应解析请求,并通过 JSON 正文传回用户详细信息

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

【问题讨论】:

    标签: javascript jwt passport.js


    【解决方案1】:

    好的,我想通了!

    事实证明(通过查看 jsonwebtoken 文档中的示例)签署令牌时使用的 iat 属性应该以秒为单位而不是毫秒。因此,tokens.js 中的Date.now() 实际上应该是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,
      };
    };
    

    【讨论】:

      【解决方案2】:

      我认为您应该在options 对象中设置jwt 令牌的Maxage 由于护照正在使用 jsonwebtoken 模块验证令牌,如果您将 ignoreExpiration 选项设置为 true 护照将不会验证令牌的过期,我知道情况并非如此,因为我在您的代码中看不到它,但我最好的猜测是你必须在你的选项中设置Maxage{ expiresIn: '1h' }

      来自documentation

      jsonWebTokenOptions:passport-jwt 正在使用 jsonwebtoken 验证令牌。在此处为您可以传递 jsonwebtoken 验证程序的任何其他选项传递一个选项对象。 (即 maxAge)

      如果您想了解更多关于jsonwebtoken

      【讨论】:

      • 您好,感谢您的回复。我刚刚将生成 JWT 的代码添加到我的问题中,您可以看到我将 expiresIn 设置为 30000(30 秒用于测试)。这是你的意思吗?
      • 我也尝试将 maxAge 属性添加到函数调用中,但也没有帮助。
      猜你喜欢
      • 2016-12-14
      • 2016-07-21
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2022-01-11
      • 2018-10-18
      • 1970-01-01
      • 2020-01-15
      相关资源
      最近更新 更多