Как правильно обрабатывать сеанс и токен доступа с Facebook PHP SDK 3.0?

В SDK PHP 3.0 нет getSession () или какой-либо доступной обработки сеанса извне Facebook api. Несколько дней назад разработчики facebook также каким-то образом обновили SDK JavaScript, согласно этой записи в блоге и этом отчете об ошибке .

В течение последних нескольких дней было внесено изменение введен в размещенный 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?

Любая помощь будет очень признательна!


Изменить

Я обнаружил, что есть некоторые проблемы IE с файлами cookie / сеансом внутри iFrame. Как видно в этом сообщении блога . С этой подсказкой и некоторыми дополнительными исследованиями я добавил следующие строки в свой загрузочный файл:

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 пользователей теряется между этапами целевой страницы (аутентификация) -> формуляр -> и регистрация . Так что есть еще кое-что, что я пропустил.


Edit 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, чтобы получить новый подписанный запрос . Хотя это может помочь решить эту проблему, я хочу, чтобы мое приложение не перенаправляло пользователя.


Edit 3

После нескольких дней интенсивной отладки и ведения журнала я обнаружил, что $ _ REQUEST [' сессия '] , полученная из 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;
}

37
задан Community 23 May 2017 в 12:28
поделиться