假设我控制两个域,www.api_domain.com
并且www.website_domain.com
. www.api_domain.com
提供一个 API,要求用户进行身份验证,然后使用会话 cookie 来识别发出请求的用户。www.website_domain.com
将脚本加载到其页面上,www.api_domain.com
并且该脚本希望www.api_domain.com
使用当前用户的 cookie 调用 API URL,并以某种方式在页面上使用结果www.website_domain.com
。
对于最初加载脚本,或任何不需要用户会话 cookie 工作的 API URL,最简单的解决方案就是使用
Access-Control-Allow-Origin: http://www.website_domain.com
来自 的响应的标头www.api_domain.com
。这似乎在除 IE 之外的所有浏览器上都可以开箱即用,尽管 IE 不会尊重使用 jQuery 的 AJAX 方法发出的 AJAX 请求的 Allow-Origin 标头,但有像 xdr.js 这样的库在幕后做了一些魔术使 jQuery、IE 和 Allow-Origin 标头可以很好地协同工作,并且在所有其他浏览器中都表现得像(我不知道 xdr.js 所做的细节,但据我所知,它非常适用于非凭据请求)。
当我想点击http://www.api_domain.com
需要用户会话 cookie 的 URL 时,问题就来了。当在与浏览器无关的环境中讨论此问题时,通常会提出两种解决方案:
- 使用
Access-Control-Allow-Credentials: true
来自的响应,即使跨域请求也可以发送 cookie。 http://www.website_domain.com
在带有 origin 的页面上创建一个 iframe ,让两个窗口使用HTML5 发布消息http://www.api_domain.com
相互通信,并将发出请求的所有责任委托给 iframe。http://www.api_domain.com
如果可能的话,我更喜欢使用选项 1,因为它可以让你编写 Javascript 代码来使用 API,http://www.api_domain.com
就像你编写它来接触同域 API 一样。要使用 iframe 方法,我们需要学习或创建一些框架,用于向 iframe 发送类似 AJAX 的请求,以及成功和错误处理程序。这也意味着我们需要创建要加载到 iframe 中的代码,这将只是一整块用于访问 API URL 的瘦包装器。它看起来比第一种方法更丑陋、更棘手、更难理解。
但是,我不知道如何使选项 1 在 IE 上工作。我正在设置Access-Control-Allow-Credentials: true
我的 API URL,所有其他浏览器都将 cookie 发送到这些 URL,但 IE 9 没有,即使使用 xdr.js 库也是如此。(我没有在 IE 8 上测试过。)没有任何其他症状需要报告。当我在 IE 的开发人员工具中查看响应时,我可以在响应中看到正确的Access-Control-Allow-Origin
和标头,但请求中没有 cookie 标头。Access-Control-Allow-Credentials
www.api_domain.com
是否有一些黑客或魔法咒语可以让 Internet Explorer 尊重Access-Control-Allow-Credentials
标头,或者我可以使用 IE 识别的其他标头?