Подтвердить что ты не робот

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

В 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;
}
4b9b3361

Ответ 1

Мое решение

Хорошо, так как все, что я делал, было всего лишь обходным решением до тех пор, пока не появится новый JS SDK, похоже, нет лучшей практики. Установка session.use_trans_sid в 1 и добавление заголовка P3P помогло преодолеть проблемы cookie IE iFrame (см. Мое первое редактирование). После нескольких дней тяжелой отладки я узнал, что FB.ui permission_request не отправляет новый токен доступа каждый раз (< 5%).

Если это произойдет, что-то пошло не так. Но это что-то сводит меня с ума. Поскольку это происходит нечасто, я могу перенаправить пользователей на вкладку facebook, чтобы получить новый подписанный запрос. С новым JS SDK, надеюсь, этого больше не будет.

Обновление: окончательное решение

Была одна небольшая вещь, которую я наблюдал, и решение можно найти здесь: FB не определена проблема
Я не загружал JS SDK асинхронно! Это все объясняет. Иногда файл all.js не был загружен достаточно быстро, поэтому произошла ошибка JS. В связи с этим ни диалог разрешения, ни проверка JS не выполнялись, и было отправлено пустое входное значение #session.

Ответ 2

Я использую теперь PHP SDK 3.x без проблем.

Naitik автор класса удалил функцию getSession(), и теперь, если вы хотите узнать, аутентифицирован ли пользователь или нет, используйте getUser().. p >

Для токена доступа это очень просто, используйте эту функцию getAccessToken(), и вы получите токен доступа, чтобы совершать вызовы Graph или Rest API. p >

$user = $facebook->getUser();

if ($user) {
//USER Logged-In
}
else {
//USER not Logged-In
}

//TO GET ACCESS TOKEN
$access_token = $facebook->getAccessToken();


//MAKE AN API CALL WITH IT
$user_info = $facebook->api('me?fields=id,name,first_name,last_name&access_token='.$access_token);

Ответ 3

Для начала, я бы отлаживал немного больше. Запишите содержимое запросов. Что хранится в $_SESSION, что прошло в $_REQUEST. Кроме того, проверьте, есть ли проблема с браузером (происходит ли это независимо от браузера или есть шаблон?)

Но так как исправление проблемы с cookie в IE (заголовок P3P) помогло, я предполагаю, что есть некоторые браузеры, которые запрещают сторонние файлы cookie. Насколько мне известно, некоторые версии Safari и Opera делают это по умолчанию. Кроме того, эта ошибка указывает, что не было access_token, в отличие от недействительного или истекшего.

Вы можете проверить это, отключив сторонние файлы cookie (используя, например, about: config в firefox), отменив настройку вашего приложения (используя "Приложения" и веб-сайты "внизу Настройки конфиденциальности Facebook), удалив файлы cookie (связанные с вашим URL холста), а затем запустив приложение.

Кстати, всегда существует возможность того, что facebook не будет возвращать токен доступа, даже если это необходимо, поскольку описано в ошибке 17236

Ответ 4

Привет, я столкнулся с одной и той же проблемой, я решил ее просмотреть JS API и перенаправить на страницу входа в PHP-SDK, если информация пользователя читаема

пример:

<script language="JavaScript">

function check_fb_status(){
    FB.api('/me', function(response){
     if(response.name) window.location='<?php echo $facebook->getLoginUrl(); ?>';
     else check_fb_status();
    });
}

check_fb_status();

</script>

если script завершил загрузку страницы входа, и пользователь получил признание как JS, так и PHP SDK;)

Ответ 5

FYI, Facebook опубликовал обновление PHP SDK около 2 часов назад, которое добавляет поддержку нового формата файлов cookie, если вы создаете сеанс на клиенте с помощью JavaScript SDK. Обновление можно найти в Facebook PHP-SDK GitHub repo.