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

Aar*_*ter 68 cookies iframe facebook facebook-iframe

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

一个小背景...

我已经玩过使用iframes嵌入式小部件(与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限制?

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

Aar*_*ter 70

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

  • 哈哈,这些评论实际上确实解释了很多关于网络浏览器 cookie 随着时间的演变的信息...... (5认同)
  • @Seth我有一段时间没有检查过,但最新版本的Safari(v6.0/iOS6和我很快就假设Chrome和FF)不再允许这个技巧了:cookie不会在post-to上设置-iframe请求.我必须研究Facebook如何为新浏览器处理这个问题.目前,localStorage似乎是一个很好的替代方法. (4认同)
  • 那么有没有办法在今天设置第三方cookie,当它在浏览器中设置阻止第三方cookie?或者有人可以通过任何方式验证今天不可能吗? (3认同)
  • 我创建了一个概念验证sinatra应用程序来演示它是如何工作的:https://github.com/agibralter/iframe-widget-test (2认同)
  • @LShetty - 抱歉,我不确定我明白你的意思......纯Javascript?演示的Ruby部分充当Web服务器...您是否想要看到用Node.js编写的演示? (2认同)
  • 让我告诉你,如果你“禁用第三方 cookie”,我相信 iframe 的解决方法将停止工作。 (2认同)
  • 第三方 cookie 将在未来 1.5 - 2 年内被完全淘汰,至少在 Chrome、Safari 中,最有可能的是 Firefox。它们已经在最新版本的 Safari 和 Chrome 的隐身模式中被淘汰。用户也可以将其关闭。对于仍然有效的浏览器,当前的解决方法是检查 cookie 是否可以从 iframe 保存,如果不能,则在主窗口中快速打开 iframe 域(重定向到 url,然后通过 JS 返回)。然后,在 cookie 中使用正确的参数 SameSite(例如 SameSite=None),它们可以工作,但仅限于这些浏览器。 (2认同)