2011-01-15 4 views
58

Ich habe Facebook Dokumentation über Canvas-Anwendungen lesen und stieß auf eine Beispielanwendung: http://developers.facebook.com/docs/samples/canvas. Als ich aber ihr Beispiel durchlas, war ich sehr verwirrt über die Verwendung von Cookies in der iframe-Anwendung.Wie setzt Facebook Cross-Domain-Cookies für iFrames auf Canvas-Seiten?

Ein wenig Hintergrund ...

ich bereits um gespielt hatte iframes für eingebundene Widgets (in keinem Zusammenhang mit Facebook) und ich fand heraus, ein paar Browser (Chrome, Safari, etc.) hat strenge Cookie Richtlinien bei der Verwendung und Cross-Domain-Cookies dürfen nicht in Iframes gesetzt werden (Firefox hingegen erlaubt Iframes, Cross-Domain-Cookies in Iframes zu setzen). Wenn beispielsweise foo.com einen iframe mit src="http://bar.com/widget" hat, kann das iframe-Widget keine Cookies für bar.com setzen und hat daher Probleme mit dem persistenten Status im iframe: bar.com interpretiert jede Anfrage (einschließlich Ajax-Anfragen) aus dem Widget als eine neue Anfrage ohne eine etablierte Sitzung. Ich kämpfte und fand einen Weg um dies mit JSONP und Javascript, um Cookies für foo.com stattdessen setzen ...

... und so?

Nun, ich schaute auf die Beispiel-Leinwand iframe Facebook-Anwendung und ich bemerkte, dass ihre Anwendung (gehostet auf runwithfriends.appspot.com) in der Lage ist, einen Cookie, u, mit der aktuellen Benutzer-ID zusammen mit ein paar anderen Parameter für die Domäne runwithfriends.appspot.com. Es sendet diesen Cookie mit jeder Anfrage ... und es funktioniert in Chrome und Firefox! WTF? Wie kommt Facebook zu den Cross-Domain-Cookie-Einschränkungen für Chrome?

(ich weiß die Antwort schon jetzt, aber ich dachte, das könnte hilfreich sein für alle, die gleiche Sache, um herauszufinden, zu kämpfen -. Ich werde die Antwort unten schreiben)

+0

Update: die neuesten Versionen einiger Browser (Safari v6.x + unter OS X, Safari unter iOS 6+, und ich nehme an, Chrome und FF bald) erlauben keine Einstellung von Cross-Domain-Cookies mehr, auch bei Post-zu-Iframe-Anfragen. –

Antwort

59

Also das iFrame nicht wirklich ist Setzen des u Cookies für die Domäne runwithfriends.appspot.com. Was Facebook tut, ist es ein Formular erstellt, <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST"> und verwendet Javascript, um das Formular beim Laden der Seite zu übermitteln. Da das Ziel des Formulars der iframe ist, wird die Seite nicht neu geladen ... es lädt nur den iframe mit der Antwort des POST. Anscheinend setzen Chrome und andere Browser mit strengen Cookie-Richtlinien Cookies für domänenübergreifende Anfragen, wenn es sich um POST-Anfragen handelt ...

+2

Ich habe eine Proof-of-Concept-Sinatra-App erstellt, um zu demonstrieren, wie das funktioniert: https://github.com/agibralter/iframe-widget-test –

+0

Hey Aaron, hast du bitte eine reine Javascript-Version dieses Codes/Demo? – lshettyl

+2

@LShetty - Entschuldigung, ich bin mir nicht sicher, ob ich verstehe, was du meinst ... pures Javascript? Der Ruby-Teil der Demo fungiert als Webserver ... meinst du, du willst die Demo in Node.js geschrieben sehen? –