Как выйти из приложения Facebook, но сохранить вход из Facebook - PullRequest
9 голосов
/ 20 марта 2012

Я пробовал PHP SDK (v.3.1.1) и текущий Javascript SDK, как предлагается здесь: https://developers.facebook.com/docs/guides/web/

теперь при попытке выхода из системы я пробовал оба FB.logout ()(для js) и $ facebook-> getLogoutUrl ();

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

НоМне нужно только выйти из приложения Facebook (на тестовом сайте).

Я пытался выйти из системы с моего тестового сайта, игнорируя аспект Facebook.Но в этом случае, когда пользователь снова нажимает кнопку входа в систему, поток входа в систему (проверка подлинности и перенаправление в Facebook) не происходит.

Я также пытался: (как предлагалось в предыдущих нерешенных вопросах)

$facebook->destroySession();

unset($_SESSION['fb_' . sfConfig::get('app_fb_config_id') . '_code']);
unset($_SESSION['fb_' . sfConfig::get('app_fb_config_id') . '_access_token']);
unset($_SESSION['fb_' . sfConfig::get('app_fb_config_id') . '_user_id']);    

однако при перенаправлении на страницу входа $ facebook-> getUser () по-прежнему получает пользователя.

примечание: в соответствии с примером документации я использую php sdk для входа пользователя в мой тестсайт, и JS SDK, чтобы визуализировать и облегчить кнопку входа в Facebook.

дополнительно:

аутентификация, которую я использую, в основном соответствует документации:

<?php

define('YOUR_APP_ID', 'YOUR APP ID');

//uses the PHP SDK.  Download from https://github.com/facebook/php-sdk
require 'facebook.php';

$facebook = new Facebook(array(
  'appId'  => YOUR_APP_ID,
  'secret' => 'YOUR APP SECRET',
));

$userId = $facebook->getUser();

?>

<html>
  <body>
    <?php if ($userId) { 
      $userInfo = $facebook->api('/' + $userId); ?>
      Welcome <?= $userInfo['name'] ?>
    <?php } else { ?>
    <div id="fb-root"></div>
    <fb:login-button></fb:login-button>
    <?php } ?>
    <script>
      window.fbAsyncInit = function() {
        FB.init({
          appId      : '<?= YOUR_APP_ID ?>',
          status     : true, 
          cookie     : true,
          xfbml      : true,
          oauth      : true,
        });

        FB.Event.subscribe('auth.login', function(response) {
          window.location.reload();
        });
      };

      (function(d){
         var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/en_US/all.js";
         d.getElementsByTagName('head')[0].appendChild(js);
       }(document));
    </script>
  </body>
</html>

1 Ответ

5 голосов
/ 20 марта 2012

Взяв ваш код и немного изменив его:

<?php
    define('YOUR_APP_ID', 'YOUR APP ID');

    //uses the PHP SDK.  Download from https://github.com/facebook/php-sdk
    require 'facebook.php';

    $facebook = new Facebook(array(
      'appId'  => YOUR_APP_ID,
      'secret' => 'YOUR APP SECRET',
    ));

    session_start();

    $userId = $facebook->getUser();
    if ($userId && !isset($_SESSION['fbdata'])) {
        $_SESSION['fbdata'] = array("userid" => $userId);
    }
?>

<html>
    <body>
    <?php if ($userId) {
        $userInfo = $facebook->api('/' + $userId); ?>
        Welcome <?= $userInfo['name'] ?>
    <?php } else { ?>
        <div id="fb-root"></div>
        <fb:login-button></fb:login-button>
    <?php } ?>
        <script type="text/javascript">
            window.fbAsyncInit = function() {
                FB.init({
                    appId      : '<?= YOUR_APP_ID ?>',
                    status     : true, 
                    cookie     : true,
                    xfbml      : true,
                    oauth      : true,
                });

                FB.Event.subscribe('auth.login', function(response) {
                    window.location.reload();
                });
            };

            (function(d){
                var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
                js = d.createElement('script'); js.id = id; js.async = true;
                js.src = "//connect.facebook.net/en_US/all.js";
                d.getElementsByTagName('head')[0].appendChild(js);
            }(document));
        </script>
    </body>
</html>

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

Когда вы хотите выйти из системывашего приложения, но не из Facebook, просто уничтожьте этот сеанс:

session_start(); 
session_destroy();

Это должно удалить все сохраненные данные, которые у вас есть для пользователя, в следующий раз, когда он посещает вашу страницу, вы можете начать с него все заново.

Я не программист php, и весь php, который я использовал здесь, основан на моих (очень) ограниченных знаниях и том, что я нашел вокруг.

...