Facebook如何在canvas页面上设置iFrame的跨域Cookie?

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

有点背景

我已经玩过使用embedded式小部件(与Facebook无关)的iframe,我发现一些浏览器(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请求)解释为新的请求,而无需build立会话。 我挣扎着,find了解决方法,通过使用JSONP和JavaScript为foo.com设置Cookie。

… 所以?

那么,我正在看示例的canvasiframe Facebook应用程序,我注意到他们的应用程序(托pipe在runwithfriends.appspot.com)能够设置一个cookie,当前用户的ID以及一些其他参数runwithfriends .appspot.com域名。 它发送这个cookie与每个请求…它在Chrome和Firefox的作​​品! WTF? Facebook如何绕过Chrome的跨域cookie限制?

(我现在已经知道了答案,但是我认为这可能对任何想要找出同样结果的人都有帮助 – 我会在下面发表答案。)

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