Как Facebook устанавливает междоменные куки для iFrames на страницах холста? - PullRequest
64 голосов
/ 15 января 2011

Я просматривал документацию Facebook, читая о приложениях Canvas, и натолкнулся на пример приложения: http://developers.facebook.com/docs/samples/canvas. Однако, прочитав их пример, я очень запутался по поводу использования ими файлов cookie в приложении iframe.

Немного предыстории ...

Я уже поиграл с использованием iframes для встраиваемых виджетов (не связанных с Facebook), и я обнаружил, что в нескольких браузерах (Chrome, Safari и т. Д.) Действуют строгие политики в отношении файлов cookie и не разрешается использование междоменных файлов cookie в iframes. (Firefox, с другой стороны, позволяет iframes устанавливать междоменные куки в iframes). Например, если на foo.com есть iframe с src="http://bar.com/widget", виджет iframe не сможет установить файлы cookie для bar.com и, следовательно, будет иметь проблемы с сохранением состояния в iframe: bar.com будет интерпретировать каждый запрос (включая ajax). запросы) из виджета как свежий запрос без установленного сеанса. Я боролся и нашел способ обойти это, используя вместо этого JSONP и javascript для установки файлов cookie для foo.com ...

... и так?

Что ж, я посмотрел пример приложения Facebook iframe для холста и заметил, что их приложение (размещенное на runwithfriends.appspot.com) способно установить cookie u с текущим идентификатором пользователя и несколькими другие параметры для домена runwithfriends.appspot.com. Он отправляет этот файл cookie при каждом запросе ... и работает как в Chrome, так и в Firefox! WTF? Как Facebook обходит ограничения междоменных файлов cookie в Chrome?

(Я уже знаю ответ сейчас, но я подумал, что это может быть полезно для любого, кто пытается понять то же самое - я опубликую ответ ниже.)

1 Ответ

65 голосов
/ 16 января 2011

Таким образом, iFrame фактически не устанавливает файл cookie u для домена runwithfriends.appspot.com.Что Facebook делает, так это создает форму <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST"> и использует javascript для отправки формы при загрузке страницы.Поскольку целью формы является iframe, она не перезагружает страницу ... она просто загружает iframe с ответом POST.Очевидно, что даже Chrome и другие браузеры со строгими политиками использования файлов cookie устанавливают файлы cookie для запросов между доменами, если они являются запросами POST ...

...