Express passportJS如何处理会话cookie?
初始问题: 我在后端使用passportJS,将MongoStore用作会话存储,并带有react前端 我试图做的是允许用户有一个持久的登录会话。已经有一个cookie由名为connect.sid的express会话自动设置。但是,会话似乎不是持久的,因为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
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,
})
);