假设我控制两个域, www.api_domain.com
和www.website_domain.com
。 www.api_domain.com
提供了需要用户身份验证,然后使用会话cookie来识别谁发出请求用户的API。 www.website_domain.com
从加载脚本到其页面www.api_domain.com
和脚本想让到API网址调用www.api_domain.com
与当前用户的cookie和网页上以某种方式使用结果www.website_domain.com
。
对于最初加载脚本,或者不需要用户的会话cookie来工作的任何API网址,最简单的方法就是使用一个
Access-Control-Allow-Origin: http://www.website_domain.com
头从响应www.api_domain.com
。 这似乎摸出上除了IE浏览器所有的方块,尽管IE不会尊重对使用jQuery的AJAX方法制成的AJAX请求允许来源头,有喜欢的xdr.js库里面做的场景背后的一些魔术让jQuery的,IE和允许来源头部发挥好在一起,行为像所有其他浏览器(我不知道xdr.js做什么细节,但是它完全适用于非特命请求,据我可以看到)。
问题是当我想打一个网址http://www.api_domain.com
需要用户的会话cookie。 当这个问题在浏览器无关的设置进行了讨论,两种解决方案通常建议:
- 使用
Access-Control-Allow-Credentials: true
从做饼干甚至跨域请求被发送的响应。 - 在创建页面上的iframe
http://www.website_domain.com
原产http://www.api_domain.com
,有两个窗口相互沟通使用HTML5发布消息 ,并委派发出请求的所有责任http://www.api_domain.com
到iframe中。
我非常喜欢,如果可以使用选项1,因为它可以让你写你的JavaScript代码使用的API http://www.api_domain.com
中,你会写这倒好同域的API相同的方式。 要使用iframe的方法,我们需要学习或创建发送AJAX类似请求的iframe中,成功和错误处理一些框架。 这也意味着我们需要创建的代码加载到iframe中,这将仅仅是瘦包装的整体块击中的API网址。 这似乎只是丑陋,棘手,并且难度比第一种方法来了解。
然而,我无法弄清楚如何使IE选项1的工作。 我设置Access-Control-Allow-Credentials: true
我的API网址,和所有其他的浏览器cookie发送到这些网址,但IE 9不对,即使有xdr.js库。 (我还没有对IE 8进行测试)没有其他症状时,任何报告。 我可以看到正确的Access-Control-Allow-Origin
和Access-Control-Allow-Credentials
从响应头www.api_domain.com
当我在IE浏览器的开发者工具查看它们,但也有在请求中没有cookie头。
有一些黑客攻击或魔法咒语,我可以用它来使Internet Explorer尊重Access-Control-Allow-Credentials
头,或其他一些头部,我可以使用IE浏览器识别?