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


75

我正在浏览Facebook的文档,以了解画布应用程序,并且遇到了一个示例应用程序:http : //developers.facebook.com/docs/samples/canvas。但是,当我阅读他们的示例时,我对他们在iframe应用程序中使用cookie感到非常困惑。

有点背景故事...

我已经尝试过将iframe用于可嵌入的小部件(与Facebook无关),并且发现一些浏览器(Chrome,Safari等)具有严格的Cookie策略,并且不允许在iframe中设置跨域Cookie(Firefox,另一方面,允许iframe在iframe中设置跨域Cookie)。例如,如果foo.com具有带src="http://bar.com/widget"iframe小部件的iframe,将无法为bar.com设置任何cookie,因此将iframe内的状态持久化将有困难:bar.com将解释来自的每个请求(包括ajax请求)窗口小部件作为没有建立会话的新请求。我挣扎了,找到了解决方法,使用JSONP和javascript来为foo.com设置cookie ...

... 所以?

好吧,我在看示例iframe Facebook应用程序画布时,我注意到他们的应用程序(运行在runwithfriends.appspot.com上)可以设置cookie u,其中包含当前用户的ID以及runwithfriends的其他一些参数。 appspot.com域。它会在每次请求时发送此Cookie ...并且可以在Chrome和Firefox中使用!WTF?Facebook如何克服Chrome上的跨域Cookie限制?

(我现在已经知道答案了,但是我认为这对那些想弄清楚同一件事的人可能会有帮助-我将在下面发布答案。)


1
更新:某些浏览器的最新版本(OS X上的Safari v6.x +,iOS 6+上的Safari,并且我认为很快会有Chrome和FF)不允许再设置跨域Cookie,即使是在发布到iframe后要求。
亚伦·吉布拉特

Answers:


80

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


2
我创建了一个概念证明sinatra应用程序来演示其工作原理:github.com/agibralter/iframe-widget-test
Aaron Gibralter

2
@LShetty-对不起,我不确定我是否理解您的意思……纯Javascript?该演示的Ruby部分充当Web服务器...您是否想看一下用Node.js编写的演示?
亚伦·吉布拉特

6
@Seth我已经有一段时间没有检查过了,但是Safari的最新版本(v6.0 / iOS6,我认为很快会是Chrome和FF)不再允许使用此技巧:Cookie不会在发布后设置-iframe请求。我必须研究一下Facebook如何为新浏览器处理此问题。目前,localStorage似乎是一个不错的替代方法。
亚伦·吉布拉特

1
让我告诉你,如果您拥有“禁用第三方Cookie”,那么我认为解决iframe的问题将停止工作。
Miguel

3
那么,当在浏览器中将其设置为阻止第三方Cookie时,有没有办法设置第三方Cookie?还是有人可以验证今天是否有任何可能?
naviram '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.