В PHP 3.0 SDK нет getSession()
или какой-либо обработки сеанса за пределами API Facebook. Несколько дней назад разработчики Facebook также каким-то образом обновили JavaScript SDK, согласно этой записи в блоге и этому сообщению об ошибке .
В течение последних нескольких дней изменение было
введены в размещенный JS SDK
который нарушил всю совместимость между ними
и текущий PHP SDK (2.x и 3.x).
Разработчики, которые используют как JS, так и
PHP SDK на своих сайтах скорее всего
чтобы увидеть сбой API на стороне сервера.
Однако я не знаю, действительно ли это влияет на мою проблему. Как и в ответ на этот вопрос Я получаю токен доступа диалога OAuth с помощью PHP и сохраняю новый токен доступа в сеансе.
Текущее решение
Следующий код показывает, как я обрабатываю эти сеансы. $_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 есть некоторые проблемы с файлами cookie / сессией IE. Как видно в этом блоге . С этим намеком и некоторыми дальнейшими исследованиями я добавил следующие строки в мой загрузчик:
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 пользователей теряется между шагами целевой страницы (аутентификация) -> формуляр -> и регистрацией. Так что я все еще что-то упустил.
Редактировать 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}});
И эта функция вызывается при отправке формы. Всегда работал для меня, но почему-то все равно отправляет форму, хотя 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;
}