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 的其他内容该怎么办?
| 归档时间: |
|
| 查看次数: |
4694 次 |
| 最近记录: |