Как Facebook устанавливает междоменные куки для iFrames на страницах холста?


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

Небольшая предыстория...

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

... ну и что?

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

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

1 61

1 ответ:

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