9

ho cercato l'SDK PHP (v.3.1.1), e la corrente Javascript SDK come suggerito qui: https://developers.facebook.com/docs/guides/web/Come uscire utente applicazione Facebook, ma mantenere il login da Facebook

ora quando si cerca di logout ho provato sia FB.logout() (per js) e $ facebook-> getLogoutUrl();

come documentazione per entrambi lo stato chiaramente, questi metodi disconnettono l'utente dall'applicazione e la loro sessione di Facebook.

Ma ho solo bisogno di scollegare l'utente dell'applicazione Facebook (il sito di prova).

ho cercato la registrazione l'utente dal mio sito di prova, ignorando il facebook aspetto. Ma in questo caso, quando l'utente fa di nuovo clic sul pulsante di accesso, il flusso di accesso (autenticazione e reindirizzamento di Facebook) non viene eseguito nel flusso di accesso .

Ho anche provato: (come suggerito da precedenti domande irrisolte)

$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']);  

tuttavia, quando il reindirizzamento alla pagina di login, $ facebook-> getUser() ancora recupera l'utente.

nota: come da esempio la documentazione, sto usando PHP SDK per accedere l'utente al mio sito di prova, e il js sdk, per rendere e facilitare il pulsante facebook login.

supplementare:

l'autenticazione che uso è fondamentalmente ciò che la documentazione suggerisce:

<?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> 
+0

se un utente è autenticato al vostro app e loged a facebook 'getUser()' restituisce sempre il FBID. l'eliminazione del cookie funziona, ma il sdk ottiene un nuovo access_token che invoca 'getUser' la domanda è perché vuoi farlo? né tu (l'app) né l'utente di Facebook ne ricavano nulla. – Rufinus

+0

cosa ne pensi di cancellare semplicemente il cookie di sessione che hai per quell'utente? Se elimini solo il tuo cookie, l'utente rimarrà comunque connesso a Facebook, ma non alla tua app. La volta successiva che l'utente fa clic sul pulsante di accesso, crea una nuova sessione per lui. –

+0

@NitzanTomer Ho provato a eliminare la sessione del sito di test, ma come ho affermato, in questo caso, il pulsante di accesso di js sdk non funziona più come previsto. – Alias

risposta

5

Prendendo il codice, e modificando solo un po ':

<?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> 

Ho appena aggiunto il risparmio di i dati dell'utente nella sessione. Ora, se si utilizza questo metodo, quando l'utente ottiene del nella tua pagina si dovrebbe verificare se ha già una sessione, se quindi tutto va bene non c'è bisogno di autenticarsi lui.

Quando si desidera scollegare l'utente della vostra applicazione, ma non per facebook, solo distruggere quella seduta:

session_start(); 
session_destroy(); 

Questo dovrebbe rimuovere tutti i dati salvati che hai per l'utente, la prossima volta che le visite la tua pagina si può iniziare fresco con lui.

Io non sono un programmatore php, e tutto il php che ho usato qui da mia (molto) limitata conoscenza e quello che ho trovato in giro.

+0

sì, ho provato questo approccio. ma come ho affermato nella mia ultima risposta a voi, ho appena apprezzato il fatto che Facebook sdk registri completamente l'utente fuori dal sito e da Facebook. per esempio, un utente fa apparire un browser e va al sito, usando il login fb, accede al sito, e in quella stessa azione è anche loggato su facebook. se dovessi solo distruggere la sessione del sito, l'utente è ancora loggato su facebook a causa dell'azione precedente, ma potrebbe non volerlo. – Alias

+0

quello che avrei voluto è: 1.) utente (non connesso a fb o sito) accede al sito tramite login fb, si disconnette e anche la sessione fb viene distrutta. 2.) utente (accesso a fb, non al sito), registra nel sito tramite fb login, si disconnette dal sito ma la sessione fb viene mantenuta. – Alias

+0

Ovviamente. Facebook ti offre la possibilità di disconnettere gli utenti dalla loro piattaforma, ma se adottare tale approccio o registrare l'utente solo dal tuo sito dipende da te e dalla tua applicazione. Hai chiesto come registrare un utente dalla tua applicazione e non da facebook, è quello che stavo cercando di aiutarti. Puoi avere due diversi tipi di pulsanti se non vuoi fare una scelta: "esci dal sito & fb" e "disconnetti dal sito" e lascia decidere all'utente. –