首页 文章

Facebook如何在画布页面上为iFrame设置跨域cookie?

提问于
浏览
63

我正在浏览关于canvas应用程序的Facebook文档,我遇到了一个示例应用程序:http://developers.facebook.com/docs/samples/canvas . 然而,当我阅读他们的例子时,我对他们在iframe应用程序中使用cookie感到非常困惑 .

一个小背景......

我已经玩过使用iframes嵌入式小部件(与Facebook无关),我发现一些浏览器(Chrome,Safari等)有严格的cookie策略,不允许在iframe中设置跨域cookie(Firefox,另一方面,允许iframe在iframe中设置跨域cookie) . 例如,如果foo.com的iframe为 src="http://bar.com/widget" ,iframe小部件将无法为bar.com设置任何cookie,因此无法在iframe中保持状态:bar.com将解释每个请求(包括ajax请求)从小部件作为没有 Build 会话的新请求 . 我挣扎了,通过使用JSONP和javascript为foo.com设置cookie代替了...

... 所以?

好吧,我正在查看示例画布iframe Facebook应用程序,我注意到他们的应用程序(托管在runwithfriends.appspot.com上)能够设置一个cookie, u ,当前用户的id以及runwithfriends的一些其他参数.appspot.com域名 . 它会在每个请求中发送此Cookie ...它可以在Chrome和Firefox中运行! WTF? Facebook如何解决Chrome上的跨域cookie限制?

(我现在已经知道了答案,但我认为这可能对那些努力弄清楚同样事情的人有所帮助 - 我将在下面发布答案 . )

1 回答

  • 63

    因此,iFrame实际上并没有为runwithfriends.appspot.com域设置 u cookie . Facebook所做的是创建一个表单 <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST"> 并使用javascript在页面加载时提交表单 . 由于表单's target is the iframe, it doesn' t重新加载页面...它只是使用POST的响应加载iframe . 显然,即使是Chrome和其他具有严格Cookie政策的浏览器,如果它们是POST请求,也会为跨域请求设置Cookie ...

相关问题