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

我浏览了 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 设置 cookies..。

然后呢?

好吧,我看过一个名为 iframe 的 Facebook 应用程序的例子,我注意到他们的应用程序(托管在 runwithfriends.appspot.com 上)能够设置一个 cookie,即 u,其中包含当前用户的 id 以及一些其他的域名参数。它每次请求都会发送这个 cookie... ... 而且它可以在 Chrome 和 Firefox 上运行!卧槽?Facebook 如何绕开 Chrome 的跨域 cookie 限制?

(我现在已经知道答案了,但是我想这可能对任何想要弄清楚同样问题的人有帮助——我将在下面发布答案。)

63707 次浏览

So the iFrame isn't actually setting the u cookie for the runwithfriends.appspot.com domain. What Facebook does is it creates a form, <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST"> and uses javascript to submit the form on page load. Since the form's target is the iframe, it doesn't reload the page... it just loads the iframe with the POST's response. Apparently even Chrome and other browsers with strict cookie policies set cookies for cross domain requests if they are POST requests...