如何使用CORS来允许设置Cookie
P粉765684602
2023-08-29 17:26:51
<p>我已经查看了其他相关的帖子,但都对我没有用。我在客户端使用vue,在服务器端使用node。</p>
<p>我尝试了其他帖子中建议的使用cors库的方法,但没有成功。
人们可能会认为下面的代码可以让我从客户端的localhost:8080发送请求到服务器的localhost:3000,但是所有的请求都失败了。</p>
<pre class="brush:php;toolbar:false;">const cors = require("cors");
if (process.env.ENV !== "prod") {
let corsOptions = {
origin: ["http://localhost:8080"],
credentials: true,
optionsSuccessStatus: 200,
};
app.use(cors(corsOptions));
}</pre>
<p>这是我用于设置cookie的控制器。</p>
<pre class="brush:php;toolbar:false;">router.route("/login").post(async (req, res) => {
//Authenticate users
const user = await Users.findOne({ where: { email: req.body.email } });
if (user == null) {
return res.status(400).send("找不到用户!");
}
try {
if (await bcrypt.compare(req.body.password, user.password)) {
const userInfo = {
username: user.username,
email: user.email,
age: user.age,
};
const accessToken = generateAccessToken(userInfo);
const refreshToken = jwt.sign(userInfo, process.env.REFRESH_TOKEN_SECRET);
res.cookie("token", accessToken, {
maxAge: 300000,
secure: true,
httpOnly: true,
sameSite: "none",
});
res.status(200).send("登录成功!");
} else {
res.send("邮箱或密码不正确!");
}
} catch {
res.status(500).send();
}
});</pre>
<p>这个网站上的每个答案基本上都会回到app.use(cors),但出于某种原因,对我不起作用。</p>
这可能是因为对于跨域的cookie,您设置了{sameSite:true}和{secure:true},但在您的示例中,您是在http://localhost上进行的,因此不会设置任何cookie。请参考以下链接以获取要求。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite#samesitenone_requires_secure
还要设置正确的头部,例如Access-Control-Allow-Credentials,Access-Control-Allow-Origin,Access-Control-Allow-Headers
您可以使用mkcert来参考在本地主机上进行安全连接。
我还建议在前端和后端使用相同的顶级域,并使用子域。
这里还要注意的一点是,如果域名中有端口,我认为Chrome不会设置cookie,请尝试一下。
我成功解决了这个问题,以便后来的人可以找到答案。我将cookieparser的声明移到了初始化sequelize连接的位置之前。我还在我的axios post请求中添加了withCredentials选项。通过这两个步骤,我的cookie现在都正确设置并且可以访问。