Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Express passportJS如何处理会话cookie?_Express_Session_Cookies_Passport.js_Passport Local - Fatal编程技术网

Express passportJS如何处理会话cookie?

Express passportJS如何处理会话cookie?,express,session,cookies,passport.js,passport-local,Express,Session,Cookies,Passport.js,Passport Local,初始问题: 我在后端使用passportJS,将MongoStore用作会话存储,并带有react前端 我试图做的是允许用户有一个持久的登录会话。已经有一个cookie由名为connect.sid的express会话自动设置。但是,会话似乎不是持久的,因为req.user在使用登录时设置的相同cookie的后续请求中未定义req.user不断返回未定义,这意味着passport没有以某种方式验证会话cookie 根据法律,这不应该发生 每个后续请求将不包含凭据,而是包含 标识会话的唯一cooki

初始问题: 我在后端使用passportJS,将MongoStore用作会话存储,并带有react前端

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

根据法律,这不应该发生

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

所以我想了解的是passportJS到底是如何处理客户端发送的cookie的

有人能帮我解释一下passport在这方面所采取的步骤吗

我还在我的mongoose模型中使用passport local mongoose插件,它包括下面auth.js中使用的内置身份验证/序列化/反序列化方法

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

app.js:(没有包括完整的文件,所以可以清楚地看到,因为它有100多行,如果有人建议这可能是中间件订单的问题,我将包括完整的代码)

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'
});
users.js(登录请求,如果成功,将返回新cookie)

movies.js(登录后单独请求,标题中包含以前的cookie)

更新(): 我发现了这个问题,简单到从传递给session()的对象中删除cookie选项

改为:

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

但我仍然不明白为什么Passport喜欢忽略我的cookie选项。如果我想使用secure或disable httpOnly或其他任何我可能想尝试的cookie,该怎么办?

我通常使用带有node、express和passport的express会话,以及您选择提供的任何身份验证策略。@Kasey这就是我使用的,我只是想了解服务器收到客户端cookie时会发生什么,它去哪里了?Passport是如何处理的?虽然passport的文件说它应该保持会话的持久性,但它并没有保持会话的持久性。
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!" });
  });
moviesRouter
  .route("/top")
  .get((req, res, next) => {
    console.log(req.user); // undefined
    //includes a mongodb query here and a corresponding server response
  })
app.use(
  session({
    secret: process.env.SERVER_SECRET_KEY,
    resave: false,
    saveUninitialized: false, 
    store: sessionStore,
  })
);