我目前正在学习 NextJS 并学习与用户授权相关的主题。它们保存在 MongoDB 数据库中。默认情况下,当尝试登录时,如果用户存在,我使用 createSession 函数将会话保存在他的 cookie 中。但是,我在过期时间方面遇到了麻烦,并且发现了一些矛盾。
我希望用户会话持续 20 分钟(即 cookie 将从当前时间 + 20 分钟起过期)。
export async function createSession(id) {
const expiresAt = new Date(Date.now() + 20 * 60 * 1000);
console.log(expiresAt)
const client = await MongoClient.connect(
process.env.NEXT_PUBLIC_MONGODB_USERS_URI
);
const db = client.db();
const sessionsCollection = db.collection("sessions");
const data = await sessionsCollection.insertOne({ userId: id, expiresAt });
const sessionId = data.insertedId;
const session = await encrypt({ sessionId, expiresAt, userId: id });
cookies().set("session", session, {
httpOnly: true,
secure: true,
expires: expiresAt,
sameSite: "lax",
path: "/",
});
}
但是这里有一个问题。假设现在是晚上 7:55。 console.log 应该返回 20:15 但它返回 18:15! (特别是 2024-05-08T18:15:12.420Z)。我的节点控制台为手机和计算机返回相同的时间。
而且,在我的电脑上,尽管cookie过期时间是“2024-05-08T18:15:08.544Z”,但它实际上工作正常,只持续20分钟。但是,如果我在手机上尝试,则根本不会保存 cookie(我有 cookie 权限)。
尝试使用 cookies-next 包。使用此软件包,获取和设置 cookie 的过程会更容易,然后只需复制并粘贴以下代码即可:
setCookie("session", session, { maxAge: 60 * 20, httpOnly: true, secure: true, sameSite: "lax", path: "/" });
希望它可以在您想要使用的任何设备上运行。另外,请记住,您无法在服务器端设置 cookie。
将会话保存到数据库的必要性:将会话保存到数据库可以提供持久性,并允许您更有效地管理用户会话。虽然可以仅使用 cookie 来管理会话,但将会话数据存储在数据库中可以为您提供更多控制和安全性,特别是对于会话过期、会话撤销和跨多个设备的用户会话管理等功能。但是,是否需要将会话保存到数据库取决于您的具体用例和安全要求。