Исключение OAuthException в Facebook Graph API для выхода из системы, работает после обновления

#php #codeigniter #facebook-graph-api

#php #codeigniter #facebook-graph-api

Вопрос:

Я использую модифицированную версию php-sdk версии 3.0.0, пример кода на github.com/facebook в рамках CodeIgniter в качестве вспомогательного средства.

Моя проблема в том, как указано в названии: когда я нажимаю на привязку выхода (предоставленную $Facebook->getLogoutUrl() ), я перенаправляюсь обратно на ту же страницу и получаю исключение OAuthException:

 Fatal error: Uncaught OAuthException: Error validating access token: The session is invalid because the user logged out. thrown in [...]/base_facebook.php on line 959
  

Когда я обновляю, он загружает привязку «login», как обычно. Что происходит при этом обновлении / возврате, чего не происходит при первоначальном перенаправлении?

Я понимаю, что это ограниченная информация, но из-за проблемы я думаю, что это может быть простым решением.

РЕДАКТИРОВАТЬ: Этот пост кажется актуальным: http://forum.developers.facebook.net/viewtopic.php?id=71219

В частности, эта строка:

 setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');
  

Однако я не уверен, как это реализовать и по-прежнему использовать $facebook->getLogoutUrl(); .

Заранее спасибо и просто дайте мне знать, если потребуется дополнительная информация.

Ответ №1:

У меня была такая же проблема, и я чуть не вырвал себе волосы. Однако после некоторого исследования выясняется, что проблема заключается в вредоносном файле cookie. Эта строка при выходе из системы должна это исправить:

setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');

Обязательно добавьте ‘.’ перед именем домена, если используются поддомены.

Я надеюсь, что это поможет!

Комментарии:

1. Да, я также сталкивался с этим на форумах Facebook для разработчиков. Источник: forum.developers.facebook.net/viewtopic.php?pid=273884#p273884

Ответ №2:

Как и предлагалось, я попытался:

setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');

Это не сработало. Что я сделал, так это просто скопировал код примера из fb:

 // Get User ID
$user = $facebook->getUser();

// We may or may not have this data based on whether the user is logged in.
//
// If we have a $user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.

if ($user) {
    try {
        // Proceed knowing you have a logged in user who's authenticated.
        $user_profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
    }
}

// Login or logout url will be needed depending on current user state.
if ($user) {
    $logoutUrl = $facebook->getLogoutUrl();
} else {
    $loginUrl = $facebook->getLoginUrl();
}
  

Средняя часть, с помощью которой if try get user_profile, является тестом для получения профиля пользователя, и если это не удается, идентификатор пользователя будет сброшен. Это сделает последнюю часть с getLoginUrl () и getLogoutUrl() правильной.

Я действительно считаю, что установка cookie более правильная, чем повторная попытка запроса и проверка, не сработает ли он… но поскольку setcookie не работал, у меня не было выбора : (

Глупый facebook, который возвращает токен с этим $user = $facebook->getUser(); , когда пользователь фактически выходит из системы.

Надеюсь, это поможет тем, кто в этом нуждается.

Ответ №3:

Судя по вашей ошибке, ваш веб-сайт все еще пытается подключиться к Facebook с помощью SDK. При запуске функции выхода, предоставляемой Facebook, обязательно очистите все имеющиеся у вас сеансы или хранилище, которые запускают вызовы Facebook.

Вполне вероятно, что они не очищаются до того, как вы попытаетесь выйти из Facebook, и именно поэтому он по-прежнему думает, что у вас есть соединение, но затем отлично работает при обновлении.

Комментарии:

1. Похоже, в этом проблема. Я надеялся, что есть более простой способ справиться с этим, чем создать свой собственный URL для выхода (хотя это не так уж сложно). Почему сеанс не будет очищен при перенаправлении с facebook.com для моего домена, но это было бы при обновлении?

Ответ №4:

В итоге я сделал следующее:

  1. $facebook->getLogoutUrl(array('next' => site_url('logout')));
  2. Затем в контроллере ‘logout’:
    $_SESSION = array();
    $this->load->view('myoriginalview');

При выходе из системы значение redirect_uri строки запроса URL facebook для выхода из системы устанавливается на перенаправление на контроллер ‘logout’, который затем очищает сеанс и загружает представление, в котором кнопка выхода существовала в первую очередь. Все работает нормально. Теперь мне просто нужно выяснить, как обрабатывать сеанс с истекшим сроком действия, в отличие от пользователя, вышедшего из системы -_-

Редактировать:
Что я сделал сейчас, так это аннулировал cookie надлежащим образом, как описано на facebook developers forum. Я действительно хотел бы, чтобы их документация была лучше и описала это для их PHP SDK.