Победа за мной!
Существует почти полностью недокументированная функция Facebook, связанная с сессиями iframe, о которой я нашел расплывчатую ссылку на в моем исследовании. Однако эта страница не очень хорошо объясняет это, и только после нескольких часов просмотра различных сеансовых ключей в моем iframe я смог понять, что происходит.
Раньше мое приложение iframe получало обычный раунд параметров fb_whatever
, когда происходила начальная загрузка iframe. Итак, в моем приложении я делал это при каждом запросе:
if (isset($_REQUEST['fb_sig_session_key'])) {
$_SESSION['fb_sig_session_key'] = $_REQUEST['fb_sig_session_key'];
}
if (! empty($_SESSION['fb_sig_session_key'])) $this->facebook->api_client->session_key = $_SESSION['fb_sig_session_key'];
Этот код получит fb_sig_session_key
при начальной загрузке приложения, и я перенес его в локальный $_SESSION
для использования с API. Сохранение его в локальном сеансе необходимо, потому что fb_sig_session_key
никогда не передается снова, если вы не перезагрузите iframe всего приложения.
Таким образом, проблемы возникали, когда срок действия этого сеансового ключа истекал через час или около того.
Просмотрев неясную справочную страницу, я начал изучать все $_REQUEST
переменных, которые я получал. Оказывается, даже по внутренней ссылке внутри вашего приложения iframe Facebook модифицирует запрос, чтобы передать некоторые параметры. По какой-то причине у них есть совершенно другой, но также действительный ключ сеанса, который приходит вместе с каждым запросом iframe!
Этот параметр назван в честь вашего API-ключа приложения Facebook. Поэтому, если ключ API вашего приложения «xyz123», каждый запрос внутри вашего iframe получает параметр с именем xyz123_session_key
(а также несколько других, например xyz123_expires
и xyz123_user
).
После просмотра соответствующего времени истечения срока действия для основного сеанса (исходный fb_sig_session_key
) и этого сеанса только для iframe (xyz123_session_key
) появился свет в конце туннеля: время истечения срока действия ключа сеанса только для iframe фактически время от времени обновляется. . Я не определил, когда и как (я предполагаю, что в какой-то момент это пинг Ajax), но, тем не менее, он обновляется.
Я дождался истечения срока действия исходного сеанса fb_sig_session_key
, и, конечно же, страницы моего приложения, связанные с друзьями, начали выдавать ошибки. В этот момент я переключил свой локально сохраненный ключ сеанса на новый только для iframe xyz123_session_key
, и проблема была решена. Эта сессия работает так же хорошо, как и оригинал!
Итак, мое последнее исправление кода заключается в локальном хранении сеансового ключа следующим образом:
$iframeSessionKeyName = $CONFIG['facebook']['apiKey'] . '_session_key';
if (isset($_REQUEST[$iframeSessionKeyName])) {
$_SESSION['fb_sig_session_key'] = $_REQUEST[$iframeSessionKeyName];
}
else if (isset($_REQUEST['fb_sig_session_key'])) {
$_SESSION['fb_sig_session_key'] = $_REQUEST['fb_sig_session_key'];
}
if (! empty($_SESSION['fb_sig_session_key'])) $this->facebook->api_client->session_key = $_SESSION['fb_sig_session_key'];
Это отдает предпочтение ключу «только для iframe».
Редактировать: Мое первоначальное предположение, что ключ «только для iframe» был обновлен с помощью какого-то метода Ajax, было неверным, оказалось, что эти значения устанавливаются в файле cookie Facebook. Это приводит к некоторым междоменным проблемам при использовании этих файлов cookie. Настройка P3P политика использования файлов cookie устранит эту проблему для большинства браузеров, кроме Safari. Для Safari до сих пор нет хорошей работы.
person
zombat
schedule
07.05.2009