Session-Cookie 未在 CORS 环境中发送

Posted

技术标签:

【中文标题】Session-Cookie 未在 CORS 环境中发送【英文标题】:Session-Cookie not sent in CORS environment 【发布时间】:2018-01-05 06:32:31 【问题描述】:

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

我的后端是一个 node/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));

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

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

app.use(session(options));

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

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

HTTP 请求按如下方式发送:

const response = this.http.get(url,  withCredentials: true );

我尝试了以下方法:

确保浏览器中允许第三方 cookie => 没问题。 试图将 httpOnly 设置为 false => 不走运。 使用 cookie 域进行实验:将其设置为后端地址 - 不走运。然后到前端的地址 - 也没有用。 已清除浏览器和 cookie 缓存,试用 Google Chrome 和 Edge。没有任何帮助。

有人知道谜题的哪一部分丢失了吗?

非常感谢, 史蒂文

【问题讨论】:

【参考方案1】:

Omg,我缩小了范围,终于找到了问题:

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

【讨论】:

以上是关于Session-Cookie 未在 CORS 环境中发送的主要内容,如果未能解决你的问题,请参考以下文章