PassportJS 如何处理会话 cookie?

ajj*_*raj 5 cookies session express passport-local passport.js

最初的问题: 我在后端使用passportJS,并使用MongoStore作为会话存储,并使用react前端。

我想做的是允许用户拥有持久的登录会话。已经有一个由express-session 自动设置的名为connect.sid 的cookie。然而,会话似乎不是持久的,因为req.user在使用登录时设置的相同 cookie 的后续请求中未定义该会话。req.user不断返回未定义,这意味着护照没有以某种方式验证会话cookie。

根据护照的文件,这是不应该发生的。

每个后续请求将不包含凭据,而是包含标识会话的唯一 cookie。为了支持登录会话,Passport 将对会话中的用户实例进行序列化和反序列化。

那么我想了解的是 PassportJS 到底如何处理客户端发送的 cookie?

有人可以帮我解释一下护照在这方面采取的步骤吗?

我还在我的猫鼬模型中使用了 Passport-local-mongoose 插件,其中包括下面 auth.js 中使用的内置身份验证/序列化/反序列化方法。

我的代码的相关部分供参考:

app.js:(没有包含完整的文件,因此可以很清楚,因为它有 100 多行,如果有人建议这可能是中间件顺序的问题,我将包含完整的代码)

//session and passport initialization

const sessionStore = new MongoStore({
  mongooseConnection: mongoose.connection,
  collection: "sessions",
});

app.use(
  session({
    secret: process.env.SERVER_SECRET_KEY,
    resave: false,
    saveUninitialized: false, 
    store: sessionStore,
    cookie: {
      path:"/",
      httpOnly: true,
      expires: 9999999999999999
    }
  })
);

app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

auth.js

const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;

const config = require("./config");
const User = require("./models/userModel");

passport.use(
  new LocalStrategy({ usernameField: "userName", passwordField: "password" }, User.authenticate())
);

passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

exports.userLogin = passport.authenticate("local", {
  session: true,
  failureRedirect: '/users/loginfailed'
});
Run Code Online (Sandbox Code Playgroud)

users.js(登录请求,如果成功则返回新的 cookie)

usersRouter
  .route("/login")
  .post(auth.userLogin, (req, res, next) => {
    console.log(req.user); // returns a valid user on login
    res.statusCode = 200;
    res.setHeader("Content-Type", "application/json");
    res.json({ success: true, message: "Login successful!" });
  });
Run Code Online (Sandbox Code Playgroud)

movie.js(登录后单独请求,标头中包含先前的 cookie)

moviesRouter
  .route("/top")
  .get((req, res, next) => {
    console.log(req.user); // undefined
    //includes a mongodb query here and a corresponding server response
  })
Run Code Online (Sandbox Code Playgroud)

更新感谢这个答案):我发现了这个问题,就像从传递给 session() 的对象中删除 cookie 选项一样简单。

改为这样:

app.use(
  session({
    secret: process.env.SERVER_SECRET_KEY,
    resave: false,
    saveUninitialized: false, 
    store: sessionStore,
  })
);
Run Code Online (Sandbox Code Playgroud)

但我还是不明白为什么 Passport 喜欢忽略我的 cookie 选项。如果我想使用 secure 或禁用 httpOnly 或我可能想尝试使用 cookie 的其他内容该怎么办?