OAuthException при выходе из API Facebook Graph, работает после обновления - PullRequest
2 голосов
/ 03 июня 2011

Я использую пример кода 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

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

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

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

Конкретно эта строка:

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

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

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

Ответы [ 4 ]

2 голосов
/ 09 марта 2012

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

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();, когда пользователь фактически вышел из системы.

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

2 голосов
/ 16 июня 2011

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

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

Убедитесь, что добавили '.' перед именем домена, если используются субдомены.

Надеюсь, это поможет!

1 голос
/ 07 июня 2011

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

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

При выходе из системы значение redirect_uri строки запроса URL-адреса для выхода из Facebook устанавливается так, чтобы перенаправлять его на контроллер 'logout', который затем очищает сеанс и загружает представление, в котором изначально была кнопка выхода из системы.Все работает нормально.Теперь я просто должен выяснить, как обрабатывать сеанс с истекшим сроком действия, а не вошедшим в систему пользователем.надлежащим образом, как описано на форуме разработчиков Facebook.Я действительно хотел бы, чтобы их документация была лучше, и описал это для своего PHP SDK.

1 голос
/ 04 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...