2011-01-15 1 views
58

Stavo navigando nella documentazione di Facebook leggendo le applicazioni su tela e mi sono imbattuto in un'applicazione di esempio: http://developers.facebook.com/docs/samples/canvas. Mentre leggevo il loro esempio, tuttavia, mi sono molto confuso sull'uso dei cookie nell'applicazione iframe.In che modo Facebook imposta i cookie interdominio per iFrame sulle pagine su tela?

Un po 'di retroscena ...

avevo già giocato un po' con l'utilizzo di iframe per i widget embeddable (estranei a Facebook) e ho scoperto un paio di browser (Chrome, Safari, etc.) hanno politiche rigorose cookie e non consentire l'impostazione di cookie tra domini in iframe (Firefox, d'altra parte, consente agli iframe di impostare i cookie tra domini negli iframe). Ad esempio, se foo.com ha un iframe con src="http://bar.com/widget" il widget iframe non sarà in grado di impostare alcun cookie per bar.com e quindi avrà problemi di stato persistente all'interno dell'iframe: bar.com interpreterà ogni richiesta (incluse le richieste ajax) dal widget come una nuova richiesta senza una sessione stabilita. Ho faticato e ho trovato un modo per aggirare questo usando JSONP e javascript per impostare i cookie per foo.com invece ...

... e così?

Beh, stavo guardando l'applicazione iframe su tela di esempio di Facebook e ho notato che la loro applicazione (ospitata su runwithfriends.appspot.com) è in grado di impostare un cookie, u, con l'id dell'utente corrente insieme ad alcuni altri parametri per il dominio runwithfriends.appspot.com. Invia questo cookie ad ogni richiesta ... e funziona sia in Chrome che in Firefox! WTF? In che modo Facebook aggira le restrizioni sui cookie tra domini su Chrome?

(so già la risposta adesso, ma ho pensato che questo potrebbe essere utile per tutti coloro che lottano per capire la stessa cosa -. Vi posto la risposta qui sotto)

+0

Aggiornamento: le ultime versioni di alcuni browser (Safari v6.x + su OS X, Safari su iOS 6+, e presumo che presto Chrome e FF) non consentano più l'impostazione di cookie tra domini, anche nelle richieste post-iframe. –

risposta

59

Così l'iFrame non è in realtà impostazione del cookie u per il dominio runwithfriends.appspot.com. Quello che fa Facebook è creare un modulo, <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST"> e utilizza javascript per inviare il modulo al caricamento della pagina. Poiché il target del form è l'iframe, non ricarica la pagina ... carica solo l'iframe con la risposta del POST. Apparentemente anche Chrome e altri browser con rigide policy sui cookie impostano i cookie per le richieste cross domain se sono richieste POST ...

+2

Ho creato una dimostrazione di app sinatra per dimostrare come funziona: https://github.com/agibralter/iframe-widget-test –

+0

Hey Aaron, hai una versione Javascript pura di questo codice/demo per favore? – lshettyl

+2

@LShetty - scusa, non sono sicuro di capire cosa intendi ... puro Javascript? La porzione Ruby della demo funge da server web ... vuoi dire che vuoi vedere la demo scritta in Node.js? –