Express 不设置 Cookie

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设置。

Nit*_*mpi 5

正如另一个答案中提到的,您不能在不同的域上设置 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 标志以查看响应的差异