2010-12-22 5 views
7

Sto usando Facebook php-sdk nella mia app Facebook iframe per ottenere lo stato di accesso dell'utente. Subito dopo essere uscito dall'account Facebook Account> Disconnetti, la sessione non è ancora stata distrutta. Devo aspettare alcuni minuti prima che scada la vecchia sessione, quindi la mia app otterrà nuovamente lo stato di accesso corretto.Facebook API - La sessione esiste ancora dopo il logout utente

Mi aspetto che Facebook si uccida da solo e la sessione quando l'utente si disconnette. Come posso uccidere manualmente la sessione?

Ecco il mio codice:

$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! 

RISOLTO:

chiamando $fb->api('/me') distruggerà la sessione se l'utente ha precedentemente disconnesso. Ho cambiato il mio codice come segue:

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

Se la chiamata API non è riuscita, $session sarà impostato a NULL. Comportamento molto strano, non spiegherò tutto quello che sta succedendo qui, ma ha risolto il mio problema di non aver aggiornato l'oggetto residuo della sessione tramite il metodo getSession().

+0

Se il il link dell'URL di logout è stato creato correttamente, non ci dovrebbero essere problemi con il tuo codice ... puoi mostrarci la tua pagina di front-end? – ifaour

+1

Non penso che sia un comportamento strano come è chiaramente indicato nei commenti [qui] (https://github.com/facebook/php-sdk/blob/master/examples/example.php) _Non sappiamo se è ancora valido fino a quando non facciamo una chiamata API utilizzando la sessione._ – ifaour

+0

anzi, il mio male non ho letto correttamente i commenti del codice di esempio. Grazie per il tuo input – flochtililoch

risposta

0

Facebook dovrebbe smontare la sessione dall'account a cui appartiene la sessione. È possibile utilizzare Facebook :: getUser() per verificare se questo è stato fatto:

if ($fb->getUser() === null) { 
    // User logged out 
} else { 
    // User logged in 
} 
+2

Il codice del metodo getUser() è basato su getSession(). La sessione esiste ancora dopo un logout standard di Facebook funzione pubblica getUser() { $ session = $ this-> getSession(); ritorno $ sessione? $ session ['uid']: null; } – flochtililoch

0

Prova $facebook->setSession(null) o utilizzando JavaScript <a href="/logout/" onclick="FB.logout();">Logout</a>

+1

Che funzionerebbe se dovessi gestire il bit di logout, credo, ma non ho modo di dire quando il signout è stato fatto dal menu di logout di Facebook – flochtililoch

0

Logout non funziona alcun modo di fare.

Prova a pubblicare questo link nel tuo browser, dopo aver effettuato l'accesso a Facebook.

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

Cosa succede? ti porta al tuo facebook. Nessun logout.

Qualsiasi cosa tu faccia, controlla la funzione (dipende dall'API) handleLogout e controlla l'output. Nel mio caso, restituisce l'intera pagina html di Facebook.

1

Prova a trovare la funzione FormatData da qualche parte LoginWindow (AS3) e trovare questa riga:.

vars.redirect_uri = FacebookURLDefaults.LOGIN_SUCCESS_URL 

Modificare il valore per http://www.facebook.com/ e uscita da quella pagina html quando connesso

Questo è un temporanea soluzione per disconnettersi se si è uno sviluppatore, non l'utente finale.

7

Sto usando $ fb-> getUser() e quello che ho fatto era quasi identico al tuo.

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

ho trovato che utilizzando solo API per verificare se FB viene disconnesso o non è a volte incoerente, ma con destroySession(), la sessione verrà sicuramente distrutto.

+2

ho provato, ma non è riuscito .. se l'utente si è disconnesso dal suo/suo facebook (non dall'applicazione) $ fb-> getUser() continua a fornire l'uid. anche se un nuovo utente ha accesso a Facebook, $ fb-> getUser() restituisce ancora il vecchio uid .. –

0

L'unico modo sono riuscito a risolvere questo problema è stato deselezionando la sessione utilizzando la richiesta firmata per controllare l'ID utente:

$facebook = Membership::getFacebookApp(); 
$signed_request = $facebook->getSignedRequest(); 
if(isset($_SESSION['facebook_id']) && $signed_request['user_id'] != (int)$_SESSION['facebook_id']){ 
    $_SESSION = array(); 
}