Обновление Facebook сеанса из приложения Iframe

голоса
13

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

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

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

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

Задан 07/05/2009 в 18:38
источник пользователем
На других языках...                            


2 ответов

голоса
21

Победа за мной!

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

Этот параметр называется после ключа апи Facebook Application. Так что, если ваш ключ API приложения является «XYZ123», каждый запрос внутри фрейма получает параметр с именем 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-только».

Edit: Мое первоначальное предположение о том , что ключ «IFrame только» был обновлен с помощью какого - то метода Ajax не так, оказывается, эти значения устанавливаются в печенье с помощью Facebook. Это приводит к некоторым проблемам междоменных при использовании этих куков. Настройка политики P3P печенья облегчит это с большинством браузеров, кроме Safari. Там до сих пор нет хорошей работы вокруг Safari.

Ответил 08/05/2009 в 00:32
источник пользователем

голоса
2

Просто положи

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

в верхней части страницы, и вы не потеряете сессии в IFRAME.

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

Ответил 28/01/2012 в 11:46
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more