Facebook API - сессия все еще существует после выхода пользователя из системы - PullRequest
7 голосов
/ 22 декабря 2010

Я использую Facebook php-sdk в своем приложении iframe для получения статуса входа в систему.Сразу после того, как я выйду, используя учетную запись Facebook> Ссылка на выход, сессия еще не уничтожена.Я должен подождать несколько минут, прежде чем истечет время старого сеанса, затем мое приложение снова получит правильный статус входа.

Я ожидаю, что Facebook завершит свою работу и сеанс, когда пользователь выйдет из системы.Как вручную убить сеанс?

Вот мой код:

$initParams = array(
  'appId'  => $conf['app_id'], 
  'secret' => $conf['secret_api_key'],
  'cookie' => TRUE,
);

$fb = new Facebook($initParams);
$fb->getSession();  // will return a session object eventhough user signed out!

решено:

вызов $fb->api('/me') уничтожит сеансесли пользователь ранее вышел из системы.Я изменил свой код следующим образом:

if ($session)
{
    try
    {
        $fbuid = $fb->getUser();
        $me = $fb->api('/me');
    }
    catch(FacebookApiException $e){}
}

Если вызов API завершится неудачно, $session будет установлен в NULL.Очень странное поведение, я не объясняю все, что здесь происходит, но это решило мою проблему отсутствия обновления остаточного объекта сеанса с помощью метода getSession().

Ответы [ 7 ]

7 голосов
/ 12 января 2012

Я использую $ fb-> getUser (), и то, что я сделал, было практически идентично вашему.

if ($fb->getUser())
{
    try
    {
        $me = $fb->api('/me');
    }
    catch(FacebookApiException $e){
        **$fb->destroySession();**
    }
}

Я обнаружил, что использование только API для проверки, вышел ли FB из системы или нет, иногданесовместимо, но с помощью destroySession () сеанс обязательно будет уничтожен.

3 голосов
/ 15 апреля 2012

, если вы используете вызовы JavaScript FB.INIT на странице входа в систему, а затем установите для состояния значение false из true.

подробности об атрибуте состояния: http://developers.facebook.com/docs/reference/javascript/FB.init/

1 голос
/ 25 октября 2011

Попробуйте найти функцию formatData где-нибудь в LoginWindow (AS3) и найдите следующую строку:

vars.redirect_uri = FacebookURLDefaults.LOGIN_SUCCESS_URL

Измените значение для http://www.facebook.com/ и выйдите из этой HTML-страницы при входе в систему.

Это временное решение для выхода из системы, если вы разработчик, а не конечный пользователь.

0 голосов
/ 23 апреля 2014

Единственный способ решить эту проблему - очистить сеанс с помощью подписанного запроса для проверки идентификатора пользователя:

$facebook = Membership::getFacebookApp();
$signed_request = $facebook->getSignedRequest();
if(isset($_SESSION['facebook_id']) && $signed_request['user_id'] != (int)$_SESSION['facebook_id']){
    $_SESSION = array();
}
0 голосов
/ 24 октября 2011

Выход из системы не работает так, как вы.

Попробуйте опубликовать эту ссылку в браузере после входа в Facebook.

https://www.facebook.com/logout.php

Что случилось? это приведет вас к вашему фейсбуку. Нет выхода вообще.

Что бы вы ни делали, проверьте функцию (зависит от вашего API) handleLogout и проверьте вывод. В моем случае он возвращает всю html-страницу facebook.

0 голосов
/ 23 декабря 2010

Попробуйте $facebook->setSession(null) или используйте JavaScript <a href="/logout/" onclick="FB.logout();">Logout</a>

0 голосов
/ 22 декабря 2010

Facebook должен отсоединить сеанс от учетной записи, которой он принадлежал. Вы можете использовать Facebook :: getUser (), чтобы проверить, было ли это сделано:

if ($fb->getUser() === null) {
  // User logged out
} else {
  // User logged in
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...