Обновление сеанса Facebook из приложения iframe - PullRequest
13 голосов
/ 07 мая 2009

У меня есть приложение iframe на Facebook, которое полностью внешнее. Под этим я подразумеваю, что как только пользователь получает доступ к URL-адресу холста для загрузки приложения, все ссылки в приложении iframe переходят на мои серверы, и страница холста никогда не обновляется, если пользователь не переходит в другое место на Facebook и не возвращается (или обновляет браузер).

При начальной загрузке приложения, в котором Facebook создает iframe, мне передаются все обычные параметры, такие как fb_sig_user, который позволяет мне создавать внутренний сеанс приложения на основе пользователя facebook. Этот сеанс приложения (который не сеанс Facebook, это мой собственный сеанс приложения) - все, что мне нужно, чтобы позволить пользователю работать с приложением.

Проблема наступает через час. Если пользователь покидает компьютер или использует приложение более часа, сеанс Facebook истекает. Существуют некоторые страницы приложения, которые требуют выборки информации о друзьях, и после истечения сеанса FB эти страницы прерываются и выдают ошибки, такие как «Ошибка: ключ сеанса недействителен или больше не действует».

Мой вопрос заключается в том, существует ли способ обновить сеанс Facebook пользователя из приложения iframe, чтобы он не истекал через час. Делает ли это какой-либо из вызовов API? Есть ли хитрость Facebook Connect, чтобы пинговать что-то? Есть ли какой-то определенный способ сохранить его? Мне не удалось найти ни одного примера, который бы конкретно касался этого.

Ответы [ 2 ]

21 голосов
/ 08 мая 2009

Победа моя!

Существует почти полностью недокументированная функция 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 приложения.

Итак, проблемы возникли, когда истек срок действия ключа сеанса примерно через час.

Посмотрев на расплывчатую справочную страницу 1019 *, я начал изучать все полученные $_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-only 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-only" был обновлен с помощью какого-либо метода Ajax, было неверным, оказывается, эти значения установлены в cookie в Facebook. Это приводит к некоторым междоменным проблемам при использовании этих файлов cookie. Установка политики P3P cookie облегчит это с большинством браузеров, кроме Safari. Для Safari все еще нет хорошей работы.

2 голосов
/ 28 января 2012

Просто поставь

header('P3P: CP="CAO PSA OUR"');

вверху страницы, и вы не потеряете сеанс в iframe.

Я также заметил, что этой теме хорошо 2 с половиной года. Я только что наткнулся на использование Google. Может быть, мой пост поможет кому-то, кто сталкивается с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...