我正在 NextJs 中创建一个应用程序,并在用户登录时设置了 cookie 授权:
res.setHeader("Set-Cookie", [
cookie.serialize("authorization", `Bearer ${jwtGenerated}`, {
httpOnly: true,
secure: process.env.NODE_ENV !== "development",
sameSite: true,
maxAge: 60 * 60 * 12,
path: "/",
})
]);
这部分代码完美运行,它在浏览器中设置了 cookie。但是,当我注销时,我向执行此代码的 url /api/logout
发出请求:
import cookie from "cookie";
export default (req, res) => {
res.setHeader("Set-Cookie", [
cookie.serialize("authorization", "false", {
httpOnly: true,
secure: process.env.NODE_ENV !== "development",
sameSite: true,
maxAge: 5,
path: "/",
})
]);
return res.status(200).json({ roles: null, auth: false });
};
但是它似乎在生产中不起作用。当我在 localhost 时,它会删除 cookie 并更改它们的值。但是在生产中没有任何改变。到期时间保持不变,价值和其他一切。 难道我做错了什么?当用户注销时,还有其他方法可以删除此 cookie 吗?
答案 0 :(得分:1)
您是否使用 Vercel 作为部署平台?这个错误是因为 Next.js 的无服务器特性总是返回一个 304 Not Modified
。坦率地说,我不知道为什么会在服务器上发生这种情况,但我相信这与 Next.js 内部的 HTTP 请求有关。
为了解决这个问题,我将注销请求设为一个带有静态密钥的 POST
请求。这将防止发生 304 Not Modified
错误。
import cookie from "cookie";
export default (req, res) => {
if (req.method !== 'POST') return res.status(405).json({ status: 'fail', message: 'Method not allowed here!' });
if (req.body.key === 'static_key') {
res.setHeader("Set-Cookie", [
cookie.serialize("authorization", "false", {
httpOnly: true,
secure: process.env.NODE_ENV !== "development",
sameSite: true,
maxAge: 5,
path: "/",
})
]);
return res.status(200).json({ roles: null, auth: false });
}
return res.status(400).json({ status: 'fail', message: 'Bad request happened!' });
};