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

Jef*_*den 16 cookies firefox html5 cors

我正在尝试使用凭据进行CORS XHR发布.它适用于Chrome,但不适用于Firefox.Cookie不会出现在转机前请求标头中,因此我看到的是302.这在Chrome中完美运行,因为Cookie位于转机前请求标头中并且随后的POST会通过.

为什么这不适用于FF?我错过了什么?

// assume url, boundEventHandler and uploadData are defined, as this definitely works in Chrome
var xhr = new XMLHttpRequest(); 
xhr.open("POST", url, true); 
xhr.addEventListener ("readystatechange", boundEventHandler, false); 
xhr.withCredentials = true;  // FWIW, I've also tried the string 'true'
xhr.send(uploadData);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我看到一些帖子说我可以在服务器端代理请求,但我更愿意按照CORS规范来实现.

谢谢!

Bor*_*sky 19

根据https://www.w3.org/TR/cors/#resource-preflight-requests的规范,预检请求永远不会包含cookie.具体来说,规范说:

  • 排除用户凭据.

并链接到https://www.w3.org/TR/cors/#user-credentials,其中说:

出于本规范的目的,术语用户凭证意味着cookie,HTTP身份验证和客户端SSL(...).

也就是说,上面引用的代码片段根本不涉及预检:没有上传事件监听器,方法是简单的方法,并且没有设置作者标头.因此,如果您真的看到了飞行前请求,那么第一个问题就是为什么会发生这种情况.您是否在Firefox中有任何可能正在修改XMLHttpRequest对象的扩展?

  • 这真的很有用!我在app引擎中为我的选项方法强制执行身份验证,这导致服务器返回相同的错误302.删除选项方法上的身份验证允许我的XHR现在正确响应. (5认同)
  • 预检请求的全部意义在于通过让服务器知道有人想要执行某种奇怪的请求并允许服务器在知道如何正确处理这些事情的情况下将这些事情明确列入白名单来保护服务器免受网页的影响。 .. 因为默认情况下许多服务器不知道如何正确处理它们。这意味着没有 cookie,因为这会打开一个针对毫无戒心的服务器的攻击媒介。如果 _server_ 指示的 cookie 被允许,则允许 cookie 的唯一方法是。但它会怎么做呢?对预检的反应是它是如何做的。 (2认同)