我把url保存在会话中的一个returnTokey中,只要不调用passport.authenticate()中间件,它就会一直存在会话中,调用这个中间件后,我的会话密钥就丢失了。这是我的isLoggedin函数,它将url保存在req.session.returnTo中:
isLoggedin: async (req, res, next) => {
if (!req.isAuthenticated()) {
req.session.returnTo = req.originalUrl;
req.flash("error", "Please login");
await req.session.save();
return res.redirect("/login");
}
next();
},
在呈现(“/login”)页面之后,它向(“/login”)发送一个post请求以验证用户。
这是post请求处理器,我有console.log session来显示中间件**passport.authenticate()**被调用前后session的值:
router
.route("/login")
.get(authentication.loginrender)
.post(
(req, res, next) => {
console.log(req.session);
next();
},
passport.authenticate("local", {
failureFlash: false,
failureRedirect: "/login",
}),
(req, res, next) => {
console.log(req.session);
next();
},
authentication.loginuser
);
下面是登录后控制台的输出,authenticate之前会话中有**“returnTo”**,但在passport.authenticate()之后丢失:
CONSOLE OUTPUT IMAGE AFTER LOGGIN IN
这是我的app.js文件:
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.engine("ejs", ejsmate);
app.use(express.static(path.join(__dirname, "public")));
app.use(express.urlencoded({ extended: true }));
app.use(cookieparser());
const sessionConfig = {
secret: "thisshouldbeabettersecret!",
resave: false,
saveUninitialized: true,
cookie: {
httpOnly: true,
expires: Date.now() + 1000 * 60 * 60 * 24 * 7,
maxAge: 1000 * 60 * 60 * 24 * 7,
},
};
app.use(session(sessionConfig));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new localstrategy(User.authenticate()));
app.use(flash());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
有人能帮我吗?我真的很难解决这个问题,从过去的几天。
1条答案
按热度按时间6qqygrtg1#
我面临着同样的错误,在搜索了很多之后,似乎保持会话可能会导致安全缺陷,所以自passport 6以来,身份验证自动导致会话擦除。
您可以解决此添加问题
keepSessionInfo:真
到你的护照。认证,但你会得到回安全问题。
为了解决这个问题,你需要以另一种方式存储这些值(例如redis)。