假設我控制兩個域,即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