В SDK PHP 3.0 отсутствует getSession()
или любая обработка сеанса из-за пределов доступной api-страницы Facebook. Несколько дней назад разработчики facebook также как-то обновили JavaScript sdk, согласно этой записи в блоге и этот отчет об ошибке.
В течение последних нескольких дней произошло изменение введенный в размещенный JS SDK который нарушил всю совместимость между ним и текущий PHP SDK (2.x и 3.x). Разработчики, которые используют как JS, так и PHP SDK на своих сайтах, скорее всего, для устранения сбоя API на стороне сервера.
Однако, я не знаю, действительно ли это влияет на мою проблему. Как в ответить на этот вопрос Я извлекаю токен доступа из диалога OAuth с PHP и сохраняю новый токен доступа в сеансе. p >
Текущее обходное решение
Следующий код показывает, как я обрабатываю эти сеансы. $_REQUEST['session']
- это содержимое ответа диалога OAuth.
if(isset($_REQUEST['session'])) {
$response = json_decode(stripslashes($_REQUEST['session']), true);
if(isset($response['access_token'])) {
$this->api->setAccessToken($response['access_token']);
$_SESSION['access_token'] = $this->api->getAccessToken();
}
}
elseif(isset($_SESSION['access_token']) && ! isset($_REQUEST['signed_request']))
$this->api->setAccessToken($_SESSION['access_token']);
elseif(isset($_REQUEST['signed_request'])) {
Session::invalidate('fbuser');
$_SESSION['access_token'] = '';
}
Вот как я обрабатываю данные пользователя:
try {
$this->user = Session::getVar('fbuser');
if ($this->user === false || is_null($this->user)) {
$facebookUser = $this->api->api('me?fields=id,name,first_name,last_name');
$this->user = new FBUserModel(array('fbId' => $facebookUser['fbId'], ...));
Session::setVar('fbuser', $this->user);
}
}
Проблема
Все хорошо выглядит во время тестирования. Только однажды произошла ошибка: в первый раз после того, как было установлено разрешение. Теперь, поскольку приложение подключено к сети, кажется, что ошибка возникает в среднем с каждым вторым пользователем в
$facebookUser = $this->api->api('me?fields=id,name,first_name,last_name');
с ошибкой:
An active access token must be used to query information about the current user.
Вопрос
Так почему это происходит? Отладка очень сложна, поскольку ошибка возникает, когда пользователь впервые вводит приложение, после того, как аутентификация приложения и токен доступа изменились. И даже это не происходит каждый раз. Как я должен обрабатывать сеанс и получить доступ к токену с помощью нового PHP SDK?
Любая помощь будет высоко оценена!
Изменить
Я выяснил, что в iFrame есть некоторые проблемы с IE с cookie/session. Как видно в этом сообщении в блоге. С этим намеком и некоторыми дополнительными исследованиями я добавил следующие строки в мой загрузочный файл:
ini_set('session.use_trans_sid', 1);
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
Теперь его намного лучше, но информация от примерно 2 из 50 пользователей теряется между шагами целевой страницы (аутентификация) → formular → и регистрацией. Так что я все еще пропустил.
Изменить 2
Я отредактировал мою обработку пользователя из
if ($this->user === false || is_null($this->user)) {
// get user data
}
к
if ((is_object($this->user) && $this->user->fbId == '') || $this->user === false || is_null($this->user)) {
// get user data
}
Кажется, это немного помогает. Я думаю, что главная проблема - это где-то в моей сессии.
Кроме того, я добавил блок try/catch, чтобы узнать, не выбрано ли в моем приложении Facebook OAuthException
. Если это так, я перенаправляю верхнее расположение на страницу и вкладку Facebook, чтобы получить новый подписанный запрос. Хотя это может помочь решить эту проблему, я хочу, чтобы мое приложение не могло перенаправить пользователя.
Изменить 3
После нескольких дней интенсивной отладки и регистрации я обнаружил, что $_REQUEST['session']
, исходящий из метода FB.ui permissions.request, пуст нечасто.
Вот как я его обрабатываю:
Это материал, который я всегда включал:
FB.provide("UIServer.Methods", {'permissions.request': {size : {width: 575, height: 300}, url: 'connect/uiserver.php', transform : FB.UIServer.genericTransform}});
И эта функция вызывается в форме submit. Всегда работал на меня, но как-то он все равно отправляет форму, хотя session == ''
.
function getPermission(form) {
session = $('#' + $(form).attr('id') + ' input[name="session"]');
if($(session).val() != '') {
form.submit();
return;
}
FB.ui({method: "permissions.request", "perms": 'user_photos'}, function callback(info){
if(info.status=='connected' && info.session !== null) {
$(session).val(JSON.stringify(info.session));
form.submit();
}
});
return;
}