假设我控制两个域,即www.api_domain.com
和www.website_domain.com
。 www.api_domain.com
提供了一个API,要求用户进行身份验证,然后使用会话Cookie来识别发出请求的用户。 www.website_domain.com
从www.api_domain.com
将脚本加载到其页面上,并且该脚本想用当前用户的cookie拨打www.api_domain.com
上的API URL并在www.website_domain.com
的页面上以某种方式使用结果。没有iframe的IE 8和9的跨域cookie?
;初始加载脚本,或者不需要用户的会话cookie来工作的任何API网址,最简单的方法是简单地从www.api_domain.com
响应使用
Access-Control-Allow-Origin: http://www.website_domain.com
头。这似乎在除了IE之外的所有浏览器中都可以使用,尽管IE不会遵守使用jQuery的AJAX方法进行的AJAX请求中的Allow-Origin头部,但有些类似于xdr.js的库在后台执行一些魔术,使jQuery,IE和Allow-Origin头文件在一起很好地运行,并且在所有其他浏览器中表现得很像(我不知道xdr.js的具体细节,但是对于非凭证请求我可以很好地工作)。
问题出现在我想要访问需要用户会话cookie的http://www.api_domain.com
上的URL。当这个问题在浏览器无关的设置进行了讨论,两种解决方案通常建议:
- 从 响应使用
Access-Control-Allow-Credentials: true
做饼干甚至跨域请求被发送。 - 上
http://www.website_domain.com
原产http://www.api_domain.com
在页面上创建一个iframe,有两个窗口使用HTML5 post messages与 相互通信,并委派发出请求http://www.api_domain.com
到 iframe的所有 责任。
我会非常喜欢,如果可以使用选项1,因为它可以让你写你的JavaScript代码,你会写这倒好同域的API相同的方式使用API上http://www.api_domain.com
。要使用iframe方法,我们需要学习或创建一些框架,用于向iframe发送类似AJAX的请求,并带有成功和错误处理程序。这也意味着我们需要创建要加载到iframe中的代码,这只是用于访问API URL的整个精简包装器。它看起来比第一种方法更丑陋,更棘手,更难理解。
但是,我不知道如何使选项1工作在IE浏览器。我在我的API网址上设置了Access-Control-Allow-Credentials: true
,所有其他浏览器都向这些网址发送了cookie,但即使使用xdr.js库,IE 9也不会。 (我还没有在IE 8上测试过)。没有任何其他症状可以报告。当我在IE的开发人员工具中查看它们时,我可以在www.api_domain.com
的响应中看到正确的Access-Control-Allow-Origin
和Access-Control-Allow-Credentials
标题,但请求中没有cookie标头。
是否存在一些黑客或魔法咒语,我可以使Internet Explorer尊重Access-Control-Allow-Credentials
标题,或者我可以使用IE的其他标题识别?
设置p3p隐私策略有帮助吗? http://stackoverflow.com/questions/2666376/copying-cookies-cross-domain-why-is-ie-blocking-cookies-other-browsers-are-send?rq=1 – flup 2013-03-08 20:44:19
@flup Nope,这是完全不相干的这个。 – 2014-04-20 11:15:31
另一方面,这无助于回答这个问题,但可能对任何读者都有用:而不是制作自己的代理iframe,考虑使用[this library](https://github.com/jpillora/xdomain/) 。我没有对它进行测试,但它看起来应该透明地完成通过邮件为您提供代理跨域AJAX流量的所有工作。除非您另外需要supercookie支持来处理越来越多的默认情况下阻止“第三方”cookie的浏览器(包括在iframe中设置的cookie),它应该是足够的。 – 2014-04-20 11:28:23