Удалить сессионный файл cookie Facebook из моего приложения при выходе из системы - PullRequest
5 голосов
/ 24 ноября 2010

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

Все работает нормально, кроме следующих случаев:

  1. Пользователь вошел в системус моего веб-сайта и Facebook.
  2. Пользователь попытается снова войти в мое приложение.

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

Я обнаружил, что причина в том, что старый файл cookie fbs не удаляется при выходе из системы.Я добавил код для удаления файла cookie при выходе из приложения, но файл cookie не был удален.

Вот мой код (с использованием инфраструктуры Symfony.)

$fbCookie = 'fbs_'.sfConfig::get('app_facebook_application_id');
          $cookie = $request->getCookie($fbCookie);
          if(!is_null($cookie)){
            setCookie($fbCookie," ", time()-3600);
          }       

Это не 'т работа.Печенье остается прежним.Функция setCookie возвращает «1», как и ожидалось.

В чем может быть проблема?

Ответы [ 9 ]

9 голосов
/ 23 января 2011

Я почти уверен, что у меня тоже были проблемы с этим ... вам нужно убедиться, что вы убили сеанс Facebook сразу после удаления файла cookie, иначе он просто всплывет ... вот пример

  // Assuming that $facebook is your facebook object populated with your settings
  $facebook = new Facebook(array(
          'appId'  => FB_APPID,
          'secret' => FB_APPSECRET,
          'cookie' => true));

  $fb_key = 'fbs_'.sfConfig::get('app_facebook_application_id');
  set_cookie($fb_key, '', '', '', '/', '');
  $facebook->setSession(NULL);
5 голосов
/ 04 апреля 2012

В текущей версии Facebook SDK вам нужно использовать

$fb_key = 'fbsr_'.$facebookConfig['app_id'];
setcookie($fb_key, '', time()-3600);
$facebook->destroySession();

Я пытался удалить куки и сеанс вручную, но по какой-то причине он все еще не работал (см. Facebook PHP: после того, как пользователь выходит из Facebook, он не может войти в мое приложение с другим пользователем ).Использование вышеприведенного решения было тем, что сработало в конце.

1 голос
/ 09 сентября 2012

Обязательно используйте следующий код:

$params = array( 'next' => 'https://yourUrl/logout' );
        $data['logoutUrl'] = $this->facebook->getLogoutUrl($params);

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

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

У меня была такая же проблема, и ни одно из решений, которые я нашел в сети, не работало для меня.Затем вдруг другое приложение с тем же кодом работало нормально, поэтому я проверил дополнительные настройки в приложении, и оно работало, когда я изменился: OAuth 2.0 для холста ENABLED, события без часового пояса ENABLED и обновление до запросов 2.0 ENABLED

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

0 голосов
/ 14 февраля 2012
<?php

// include the Facebook SDK
include_once 'src/facebook.php';

// Define crutial perams
define( 'APPID',    '' );
define( 'SECRET',   '' );
define( 'URL',      'http://fb.domain.co.uk' );

// shake my hand!
$facebook = new Facebook( array( 'appId' => APPID, 'secret' => SECRET, 'fileUpload' => true ) );

// if we are being visited by someone trying to logout, lets me sure they get logged out!
if( isset( $_GET['logged_out'] ) ) {
    setcookie( "PHPSESSID", "", (time()-3600) );
    header( "location: " . URL );
    exit();
}

// lets try to get the users id
$user_id = $facebook->getUser();
// try to get their access token
$access_token = $facebook->getAccessToken();

// if we have an id
if($user_id) {

    // from the offset, we're good to go...
    $logged_in = true;

    echo "<h1>Logged in</h1>";
    $params = array( 'next' => URL . '?logged_out' );
    $return .= '<br /><a href="' . $facebook->getLogoutUrl($params) . '">logout</a>';

}else{

    // login man!
    $login_url = $facebook->getLoginUrl( 
        array( 
            'scope' => 'read_stream, publish_stream, manage_pages, photo_upload',
            'next' => URL . '?logged_in' 
        ) 
    );
    $return .= 'Please <a href="' . $login_url . '">login.</a>';

}

echo $return

?>
0 голосов
/ 14 декабря 2011

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

//print the cookies just to make sure what is the exact name of the cookie
foreach ($_COOKIE as $key => $value) {
    print $key . "=" . $value . "</br>";
}

//delete
if (isset($_COOKIE['fbsr_' . $app_id])) {
    setcookie('fbsr_' . $app_id, $_COOKIE['fbsr_' . $app_id], time() - 3600, "/");
    setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() - 3600, "/");

    unset($_COOKIE['fbsr_' . $app_id]);   
    unset($_COOKIE['PHPSESSID']);
}

Этот php-скрипт должен запускаться после вызова FB.logout в вашей части js:

function logout() {
    FB.init({appId: '[your app id]', status: true, cookie: true,xfbml: true});
    var flag = confirm("logout from your facebook account as well");
    if (flag) {
        FB.logout(function(response) { window.location='logout.php' });
    }
}
0 голосов
/ 03 мая 2011

У меня тоже были проблемы с этим, и вопреки ответу Efazati, моя проблема была с файлами cookie, установленными на моем собственном домене библиотекой php api Facebook. То, что я пропустил, было при удалении куки, используя точный домен и путь, по которому был установлен куки. Это строка, которая успешно удалила cookie для меня.

setcookie("fbs_" . $app_id, '', time()-3600, "/", ".mydomain.com");

Комментарий tgriesser также был полезен.

0 голосов
/ 23 января 2011

По какой-то причине вы не можете удалить cookie, даже если у вас явно есть разрешение на его чтение (потому что вам пришлось читать access_token).

Но как бы то ни было: эта проблема возникает только на localhost. На вашем сервере вы не должны сталкиваться с проблемой! Файл cookie также не удаляется на вашем сервере, но он не распознается как действительный токен access_token при повторной попытке входа в систему.

0 голосов
/ 28 ноября 2010

Как вы сказали;) это файл cookie, который устанавливает ваш локальный скрипт, а не один на Facebook.com, поэтому ваш вопрос правомерен.

Я столкнулся с той же проблемой здесь. PHPSDK не дает вам возможности удалить cookie. Так что либо вы должны запустить весь сеанс без куки:

$facebook = new Facebook(array(
    'appId'  => FB_APPID,
    'secret' => FB_APPSECRET,
    'cookie' => false,
));

или вы перенаправляете пользователя на URL-адрес выхода на Facebook:

header('Location: ' . $facebook->getLogoutUrl(array('next'=>URL_AFTER_LOGOUT))');

Единственная проблема заключается в том, что пользователь также вышел из Facebook.

Если вы можете использовать Javascript, попробуйте это:

<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
 FB.init({appId: '<?php echo FB_APPID;?>', status: true, cookie: true, xfbml: true});
 FB.Event.subscribe('auth.logout', function(response) {
    window.location.href='YOUR_LOCAL_LOGOUTSCRIPT';
 });
</script>
...