CORS环境下Session-Cookie不发送

Ste*_*ven 5 cookies cross-domain session-cookies express angular

我拼命地尝试让会话cookie在我的环境中工作,但到目前为止还没有运气。

我的后端是一个节点/express 应用程序,在端口 3000 上运行。CORS 启用如下:

const corsOptions = {
    origin: "http://127.0.0.1:4300",
    allowedHeaders: [ "Origin", "X-Requested-With", "Content-Type", "Accept", "Authorization", "x-xsrf-token" ],
    credentials: true
};
if (isDebug) {
    corsOptions.maxAge = 1;
}
app.use(cors(corsOptions));
Run Code Online (Sandbox Code Playgroud)

我使用快速会话和护照进行登录。会话配置如下:

const options = {
    secret: '...',
    cookie: { httpOnly: true }
};

app.use(session(options));
Run Code Online (Sandbox Code Playgroud)

前端是 Angular 2 SPA,在端口 4300 上运行。当我从 Express 服务器为前端提供服务时,一切都按预期工作。但如果没有,我会遇到以下晦涩的问题:

登录路由返回带有会话 ID 的 cookie。但是到后端的下一个请求是使用不同的会话 ID 发送的?!我不知道这个不同的会话 ID 是从哪里来的。特别是因为会话 cookie 被标记为仅限 HTTP。

HTTP 请求的发送方式如下:

const response = this.http.get(url, { withCredentials: true });
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

  • 确保浏览器允许第三方 cookie => 没问题。
  • 尝试将 httpOnly 设置为 false => 没有运气。
  • 尝试了 cookie 域:将其设置为后端的地址 - 没有运气。然后到前端的地址 - 也不起作用。
  • 清除浏览器和 cookie 缓存,尝试使用 Google Chrome 和 Edge。没有任何帮助。

有人知道拼图缺少哪一部分吗?

非常感谢,史蒂文

Ste*_*ven 3

天哪,我缩小了范围,终于找到了问题所在:

登录请求没有设置withCredentials-Flag...我认为只有在收到 cookie 后,后续请求才需要这样做。但实际上它是用来存储跨域接收到的cookie的。