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