使用express-session和connect-mongodb进行基于会话的身份验证(或至少尝试)。我有一个调用 req.session.destroy() 的注销路由,我将
unset
属性设置为 "destroy"
并且会话仍然显示在我的 mongo 数据库中。我尝试在客户端获取上使用不同的 credentials
但无济于事。我是个新手,试图了解身份验证的基础知识,但这个细节让我困惑。
我可能也不一定需要从存储中删除会话,但我想保持数据库尽可能干净。任何帮助将不胜感激,非常感谢!
这是我的会话配置:
app.use(
session({
name: process.env.SESSION_NAME,
secret: process.env.SESSION_SECRET,
store: MongoStore.create({
// use the client already set up with mongoose to limit connections
clientPromise: client,
}),
cookie: {
secure: false,
// 30 minute idle timeout
maxAge: 1000 * 60 * 30,
},
rolling: true,
resave: false,
saveUninitialized: false,
// deletes the session from the db
unset: "destroy",
})
);
这是我的注销路线:
router.post("/api/logout", async (req, res, next) => {
try {
await logout(req, res);
res.json({ message: "Logged out." });
} catch (error) {
next(error);
}
});
注销辅助功能:
export const logout = (req, res) => {
return new Promise((resolve, reject) => {
req.session.destroy(err => {
req.session = null;
if (err) {
reject(err);
}
res.clearCookie(process.env.SESSION_NAME);
resolve();
});
});
};
客户端代码:
await fetch("http://localhost:3000/api/logout", {
method: "POST",
credentials: "include",
});
如果需要,我可以发送更多片段,谢谢!
编辑:这将是一个跨源请求,因此我在后端设置了 CORS:
app.use(
cors({
origin: "http://localhost:5173",
credentials: true,
})
);
在 Express.js 中,当您将
rolling
选项设置为 true,并将 saveUninitialized
设置为 false 时,意味着如果不修改会话,则不会保存会话。这也意味着使用这些选项, req.session.destroy() 函数将不起作用,因为未修改的会话不包含任何数据。看下面的代码示例:
const express = require("express");
const session = require("express-session");
require("dotenv").config();
const app = express();
app.use(session({
secret: process.env.SECRET,
resave: false,
saveUninitialized: false,
rolling: true
}));
app.post("/api/start-session", (req, res) => {
res.status(200).send("Started an unmodified session.");
// The req.session.destroy() function will not destroy the current session here, as req.session does not include any session data.
});
app.post("/api/modify-session", (req, res) => {
const { name, surname } = req.body;
req.session.name = name;
req.session.surname = surname;
res.json({
session_id: req.sessionID,
name: req.session.name,
surname: req.session.surname,
message: "Started a session, and modifed it."
});
// The req.session.destroy() function must work for this code snippet.
});
app.listen(process.env.PORT, process.env.HOST, () => console.log("HTTP server is running..."));
在第一个端点“/api/start-session”中的这段代码中,将启动会话,但由于会话没有被修改,所以会话不会被保存,因此会话不能在该端点中被销毁。
但是,在第二个端点“/api/modify-session”中,当使用“req.session”修改会话数据时,会话数据将被保存,因此会话可以被销毁。
对于您想要解决的问题,您必须将
saveUninitialized
选项设置为 true 或在当前请求期间修改会话数据。
顺便说一句,您可以选择使用 req.session.save(),特别是当您不希望会话在重定向期间丢失时。