我使用护照进行身份验证,并使用 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");
}
});
如果所有用户的
PostgreSQL
数据库中仅存储一个会话,这可能是由于会话配置,或者会话管理可能存在问题,导致同一会话 ID 在登录之间重复使用。每个用户都应该在会话表中存储一个唯一的会话,以便进行正确的多用户会话管理。
saveUninitialized
:true。rolling: true
刷新会话到期时间。connect-pg-simple
设置正确并且是最新的。