web-dev-qa-db-fra.com

Comment Facebook définit-il les cookies inter-domaines pour les iFrames sur les pages de canevas?

Je parcourais la documentation de Facebook en lisant les applications de canevas et je suis tombé sur un exemple d'application: http://developers.facebook.com/docs/samples/canvas . Cependant, en lisant leur exemple, je suis devenu très confus quant à leur utilisation des cookies dans l'application iframe.

Un peu d'histoire ...

J'avais déjà joué avec l'utilisation des iframes pour les widgets intégrables (sans rapport avec Facebook) et j'ai découvert que quelques navigateurs (Chrome, Safari, etc.) ont des politiques de cookies strictes et n'autorisent pas les cookies interdomaines définis dans les iframes (Firefox, d'autre part, permet aux iframes de définir des cookies interdomaines dans les iframes). Par exemple, si foo.com a un iframe avec src="http://bar.com/widget" le widget iframe ne pourra pas définir de cookies pour bar.com et aura donc du mal à persister dans l'iframe: bar.com interprétera chaque demande (y compris les demandes ajax) du widget comme une nouvelle demande sans établissement session. J'ai eu du mal et j'ai trouvé un moyen de contourner cela en utilisant JSONP et javascript pour définir des cookies pour foo.com à la place ...

... et donc?

Eh bien, je regardais l'exemple d'application Facebook iframe canvas et j'ai remarqué que leur application (hébergée sur runwithfriends.appspot.com) est capable de définir un cookie, u, avec l'ID de l'utilisateur actuel avec quelques-uns d'autres paramètres pour le domaine runwithfriends.appspot.com. Il envoie ce cookie à chaque demande ... et il fonctionne dans les deux Chrome et Firefox! WTF? Comment Facebook contourne-t-il les restrictions de cookies inter-domaines sur Chrome?

(Je connais déjà la réponse, mais j'ai pensé que cela pourrait être utile pour quiconque a du mal à comprendre la même chose - je posterai la réponse ci-dessous.)

65
Aaron Gibralter

L'iFrame ne définit donc pas réellement le cookie u pour le domaine runwithfriends.appspot.com. Ce que fait Facebook, c'est qu'il crée un formulaire, <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST"> et utilise javascript pour envoyer le formulaire au chargement de la page. Étant donné que la cible du formulaire est l'iframe, il ne recharge pas la page ... il charge simplement l'iframe avec la réponse du POST. Apparemment, même Chrome et d'autres navigateurs avec des politiques strictes en matière de cookies définissent des cookies pour les demandes interdomaines si elles sont POST requêtes ...

67
Aaron Gibralter