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 环境中发送的主要内容,如果未能解决你的问题,请参考以下文章

未在 PHP 上设置 CORS 标头

AWS Api Gateway 未在 204 上设置 CORS

CORS cookie 未在 Chrome 中发送

Axios 未在请求中发送自定义标头(可能是 CORS 问题)

CORS withCredentials XHR 预检未在 Firefox 中发布 Cookie

浏览器未在启用 CORS 的情况下跨域跨域发送 cookie