使用 req.session.destroy() 时,Express-session 存储不会删除会话

问题描述 投票:0回答:1

使用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,
  })
);
node.js express session
1个回答
0
投票

在 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(),特别是当您不希望会话在重定向期间丢失时。

© www.soinside.com 2019 - 2024. All rights reserved.