如何设置从服务器发送到不同端口上的客户端的cookie

How set cookie sent from server to a client on a different port

我有一个后端服务器(由 Rails 提供支持),其 API 由 HTML5 前端使用,运行 在 Node 简单开发服务器上。

两者都在同一台主机上:我的机器。

当我从前端登录到后端时,rails 向我发送了会话 cookie。我可以在响应头中看到它,问题是浏览器不保存它。

政策是正确的,如果我直接从 rails 应用程序提供相同的前端,cookie 设置正确。

我能看到的唯一区别是,当前端 运行 在节点服务器上时,它 运行 在端口 8080 上, rails 在端口上3000。我知道 cookie 不应该是特定于端口的,所以我错过了这里发生的事情。

有什么想法吗?解决方案?

(我需要能够以这种方式保持设置,以便让前端从 Node 提供服务,而后端在 rails 上在不同的端口上提供服务)

你是对的,cookie 是端口不可知的,浏览器将向 myapp.local:3000 发送与 myapp.local:8080 相同的 cookie-- 除了不通过XMLHttpRequest (XHR, a.k.a., AJAX) 在执行 cross-site 请求 (CORS) 时。

解决方案: 通过在任何 XMLHttpRequest object。参见:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials

或者如果使用 Fetch API,请设置选项 credentials: 'include'。参见:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

备选方案: 由于您在问题中标记了 webpack-dev-server,您可能有兴趣通过代理请求 Rails API webpack-dev-server 首先避免任何 CORS 问题。这是在您的 weback.config:

中完成的
proxy: {
  '/some/path': {
    target: 'https://other-server.example.com',
    secure: false
  }
}

参见:https://webpack.js.org/configuration/dev-server/#devserverproxy