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

cia*_*ben 3 cookies port ruby-on-rails webpack-dev-server

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

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

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

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

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

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

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

Joh*_*ann 7

您是正确的,cookie 是端口不可知的,并且浏览器将与 myapp.local:8080 相同的 cookie 发送到 myapp.local:3000--除了在执行跨站点时不通过 XMLHttpRequest(XHR,又名,AJAX)请求 (CORS)。

解决方案:可以通过在任何 XMLHttpRequest 对象上设置withCredentials为来告知请求包含 cookie 和 auth 标头true。请参阅: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,您可能有兴趣通过 webpack-dev-server 将请求代理到 Rails API,以避免首先出现任何 CORS 问题。这是在您的 webback.config 中完成的:

proxy: {
  '/some/path': {
    target: 'https://other-server.example.com',
    secure: false
  }
}
Run Code Online (Sandbox Code Playgroud)

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