Wie setzt Facebook domänenübergreifende Cookies für iFrames auf Canvas-Seiten?

75

Ich habe in der Facebook-Dokumentation nach Canvas-Anwendungen gesucht und bin auf eine Beispielanwendung gestoßen: http://developers.facebook.com/docs/samples/canvas . Als ich ihr Beispiel durchlas, war ich jedoch sehr verwirrt über die Verwendung von Cookies in der iframe-Anwendung.

Eine kleine Hintergrundgeschichte ...

Ich hatte bereits mit der Verwendung von Iframes für einbettbare Widgets (ohne Bezug zu Facebook) herumgespielt und festgestellt, dass einige Browser (Chrome, Safari usw.) strenge Cookie-Richtlinien haben und keine domänenübergreifenden Cookies in Iframes (Firefox, Auf der anderen Seite können iframes domänenübergreifende Cookies in iframes setzen. Wenn foo.com beispielsweise einen Iframe mit src="http://bar.com/widget"dem Iframe-Widget hat, kann es keine Cookies für bar.com setzen und hat daher Probleme, den Status innerhalb des Iframes beizubehalten: bar.com interpretiert jede Anfrage (einschließlich Ajax-Anfragen) von das Widget als neue Anfrage ohne etablierte Sitzung. Ich kämpfte und fand einen Weg, dies zu umgehen, indem ich stattdessen JSONP und Javascript verwendete, um Cookies für foo.com zu setzen ...

... und so?

Nun, ich habe mir die Beispiel-Canvas-iframe-Facebook-Anwendung angesehen und festgestellt, dass ihre Anwendung (gehostet auf runwithfriends.appspot.com) ein Cookie umit der ID des aktuellen Benutzers und einigen anderen Parametern für runwithfriends setzen kann. appspot.com Domain. Es sendet dieses Cookie bei jeder Anfrage ... und es funktioniert sowohl in Chrome als auch in Firefox! WTF? Wie umgeht Facebook die domänenübergreifenden Cookie-Einschränkungen in Chrome?

(Ich kenne die Antwort bereits jetzt, aber ich dachte, dies könnte für jeden hilfreich sein, der Schwierigkeiten hat, dasselbe herauszufinden - ich werde die Antwort unten veröffentlichen.)

Aaron Gibralter
quelle
1
Update: In den neuesten Versionen einiger Browser (Safari v6.x + unter OS X, Safari unter iOS 6+ und ich gehe davon aus, dass Chrome und FF bald verfügbar sind) können keine domänenübergreifenden Cookies mehr gesetzt werden, auch nicht nach dem Iframe Anfragen.
Aaron Gibralter

Antworten:

80

Der iFrame setzt also nicht wirklich das uCookie für die Domain runwithfriends.appspot.com. Facebook erstellt ein Formular <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST">und verwendet Javascript, um das Formular beim Laden der Seite zu senden. Da das Ziel des Formulars der Iframe ist, wird die Seite nicht neu geladen. Es wird nur der Iframe mit der Antwort des POST geladen. Anscheinend setzen sogar Chrome und andere Browser mit strengen Cookie-Richtlinien Cookies für domänenübergreifende Anfragen, wenn es sich um POST-Anfragen handelt ...

Aaron Gibralter
quelle
2
Ich habe eine Proof-of-Concept-Sinatra-App erstellt, um zu demonstrieren, wie dies funktioniert: github.com/agibralter/iframe-widget-test
Aaron Gibralter
2
@LShetty - Entschuldigung, ich bin mir nicht sicher, ob ich verstehe, was du meinst ... reines Javascript? Der Ruby-Teil der Demo fungiert als Webserver. Wollen Sie damit die in Node.js geschriebene Demo sehen?
Aaron Gibralter
6
@Seth Ich habe eine Weile nicht eingecheckt, aber die neueste Version von Safari (v6.0 / iOS6 und ich gehe davon aus, dass Chrome und FF bald) erlauben diesen Trick nicht mehr: Die Cookies werden nicht auf Post-to gesetzt -iframe-Anfragen. Ich müsste untersuchen, wie Facebook dies für neue Browser handhabt. Im Moment scheint localStorage eine gute alternative Methode zu sein.
Aaron Gibralter
1
Lassen Sie mich Ihnen nur sagen, dass, wenn Sie "Cookies von Drittanbietern deaktivieren", diese Problemumgehung iframe-Sache nicht mehr funktioniert, glaube ich.
Miguel
3
Gibt es heute eine Möglichkeit, Cookies von Drittanbietern zu setzen, wenn diese im Browser so eingestellt sind, dass Cookies von Drittanbietern blockiert werden? Oder kann jemand überprüfen, ob dies heute in irgendeiner Weise nicht möglich ist?
Naviram