表中未存储多个用户的会话数据

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

我使用护照进行身份验证,并使用 connect-pg-simple 将会话存储在 PostgreSQL 数据库中。然而,我遇到了一个问题,即无论有多少用户登录或注册,一次似乎只有一个会话 cookie 存储在数据库中。不确定旧的是否被覆盖,但即使在新登录后也只存在一行。

会话表存在,每次运行选择查询时我只能看到单个会话行。这是默认行为吗?当我使用不同的帐户登录时,我希望在再次登录后添加新行。

这是相关代码

app.use(express.urlencoded({ extended: true }));
app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
      maxAge: 24 * 60 * 60 * 1000,
    },
    store: new pgSession({
      pool: pgPool,
      tableName: "session",
    }),
  })
);
app.use(passport.session());

passport.use(
  new LocalStrategy(async (username, password, done) => {
    try {
      const selectQuery = "SELECT * FROM users WHERE username=$1";
      const { rows } = await pgPool.query(selectQuery, [username]);
      const user = rows[0];

      if (!user) {
        return done(null, false, { message: "Incorrect Username" });
      }
      const cmpPassword = await bcrypt.compare(password, user.password);
      if (!cmpPassword) {
        return done(null, false, { message: "Incorrect Password" });
      }
      return done(null, user);
    } catch (err) {
      return done(err);
    }
  })
);

passport.serializeUser((user, done) => {
  return done(null, user.id);
});

passport.deserializeUser(async (id, done) => {
  try {
    const selectQuery = "SELECT * FROM users WHERE id=$1";
    const { rows } = await pgPool.query(selectQuery, [id]);
    const user = rows[0];
    done(null, user || null);
  } catch (err) {
    done(err);
  }
});

app.get("/", (req, res) => {
  res.render("index", { user: req.user });
});

app.post(
  "/login",
  passport.authenticate("local", {
    successRedirect: "/",
    failureRedirect: "/signup",
  })
);

app.get("/signup", (req, res) => {
  res.render("signup");
});

app.post("/signup", async (req, res, next) => {
  try {
    if (req.isAuthenticated()) {
      req.logOut((err) => {
        if (err) {
          return next(err);
        }
      });
    }

    const { username, password } = req.body;
    const hashedPassword = await bcrypt.hash(
      password,
      Number(process.env.SIGNUP_HASH_SALT) || randint(10, 15)
    );
    const insertQuery =
      "INSERT INTO users (username, password) VALUES ($1, $2) RETURNING *;";
    const { rows } = await pgPool.query(insertQuery, [
      username,
      hashedPassword,
    ]);

    req.logIn(rows[0], (err) => {
      if (err) return next(err);
      res.redirect("/");
    });
  } catch (err) {
    console.error(err.message);
    res.redirect("/signup");
  }
});
node.js express session-cookies
1个回答
0
投票

如果所有用户的

PostgreSQL
数据库中仅存储一个会话,这可能是由于会话配置,或者会话管理可能存在问题,导致同一会话 ID 在登录之间重复使用。每个用户都应该在会话表中存储一个唯一的会话,以便进行正确的多用户会话管理。

  1. 在会话配置中设置
    saveUninitialized
    :true。
  2. 启用
    rolling: true
    刷新会话到期时间。
  3. 清空会话表并重启服务器。
  4. 确认
    connect-pg-simple
    设置正确并且是最新的。
  5. 添加调试语句以验证会话创建。
© www.soinside.com 2019 - 2024. All rights reserved.