不同的cookie过期时间

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

我目前正在学习 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 权限)。

  1. 为什么过期时间错误但在我的电脑上却可以工作?
  2. 我应该怎样做才能使其在我的手机上运行?
  3. 是否有必要将这些session保存到数据库中(然后我使用verifySession函数,它只读取cookie)
mongodb authentication next.js cookies jwt
1个回答
0
投票

尝试使用 cookies-next 包。使用此软件包,获取和设置 cookie 的过程会更容易,然后只需复制并粘贴以下代码即可:

setCookie("session", session, { maxAge: 60 * 20, httpOnly: true, secure: true, sameSite: "lax", path: "/" });

希望它可以在您想要使用的任何设备上运行。另外,请记住,您无法在服务器端设置 cookie。

将会话保存到数据库的必要性:将会话保存到数据库可以提供持久性,并允许您更有效地管理用户会话。虽然可以仅使用 cookie 来管理会话,但将会话数据存储在数据库中可以为您提供更多控制和安全性,特别是对于会话过期、会话撤销和跨多个设备的用户会话管理等功能。但是,是否需要将会话保存到数据库取决于您的具体用例和安全要求。

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