mem*_*one 2 javascript node.js reactjs next.js
我有2台服务器。一个在localhost:5555上托管 next.js 应用程序,另一个在localhost:4444上托管 api 的快速服务器。
身份验证 api 返回一个 cookie,但是这不是在localhost:5555上运行的浏览器中设置的。
res.cookie('cokkieName', 'bob', {
domain: '127.0.0.1:5555',
maxAge: 900000,
httpOnly: true,
});
res.status(200).json({
session: jwtSigned,
role: 'default',
});
Run Code Online (Sandbox Code Playgroud)
我的 cors 设置是:
const options: cors.CorsOptions = {
allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'X-Access-Token', 'Authorization'],
credentials: true,
methods: 'GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE',
origin: 'http://localhost:5555',
preflightContinue: false,
};
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用 api 而不是通过 next.js 设置 cookie。
我试过交替 cors 设置但没有成功。客户端调用使用 axios 并且已经withCredentials设置。
正如另一个答案中提到的,您不能在不同的域上设置 cookie,因为它可能存在安全风险。
但是从你的问题...
由于 API 服务器正在运行身份验证逻辑,因此 cookie 应该设置在 API 服务器域上,而不是在客户端域上
因此,在您的 API 服务器中,您可以将代码更改为
res.cookie('cokkieName', 'bob', {
domain: '127.0.0.1:4444',
maxAge: 900000,
httpOnly: true,
});
Run Code Online (Sandbox Code Playgroud)
或者只是删除域,因为它默认为服务器域。
res.cookie('cokkieName', 'bob', {
maxAge: 900000,
httpOnly: true,
});
Run Code Online (Sandbox Code Playgroud)
由于您有一个在 localhost:5555 上运行的客户端和在 localhost:4444 上运行的 API 服务器,这是一个跨域调用,您需要传递withCredentials选项axios以传递 cookie。您可能无法在浏览器中看到 cookie,因为它可能存在安全风险,但可以在服务器控制台上回显 cookie 值。
axios.get("url",{
withCredentials: true
}).then(res => {
console.log(res);
});
Run Code Online (Sandbox Code Playgroud)
请注意,仅当 Access-Control-Allow-Origin 标头不是像 * 这样的通配符时,凭证选项才起作用
我创建了一个服务器来模仿您发布的代码。服务器基本上回显请求 cookie。
它可以通过这个stackblitz访问。您可以切换 withCredentials 标志以查看响应的差异
| 归档时间: |
|
| 查看次数: |
8236 次 |
| 最近记录: |