2010-12-22 8 views
7

Ich benutze Facebook php-sdk in meiner iframe Facebook App, um den Benutzer-Login-Status zu erhalten. Direkt nachdem ich mich über den Link Konto abmelden mit Facebook abmelde, ist die Sitzung noch nicht zerstört. Ich muss ein paar Minuten warten, bis die alte Sitzung abläuft, dann bekommt meine App wieder den richtigen Login-Status.Facebook API - Sitzung existiert noch, nachdem Benutzer sich abgemeldet hat

Ich erwarte, dass Facebook sich selbst und die Sitzung tötet, wenn Benutzer abmeldet. Wie kann ich die Sitzung manuell beenden?

Hier ist mein Code:

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

GELÖST:

$fb->api('/me') Aufruf wird die Sitzung zerstören, wenn der Benutzer aus vorher angemeldet hat. Ich habe meinen Code wie folgt geändert:

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

Wenn der API-Aufruf nicht erfolgreich ist, $session wird auf NULL gesetzt werden. Sehr seltsames Verhalten, ich erkläre nicht alles, was hier vor sich geht, aber es hat mein Problem gelöst, dass das Restsitzungsobjekt nicht über die Methode getSession() aktualisiert wurde.

+0

Wenn die Logout URL-Link ist korrekt erstellt es sollte kein Problem mit Ihrem Code .. Können Sie uns Ihre Front-End-Seite zeigen? – ifaour

+1

Ich denke nicht, dass es ein merkwürdiges Verhalten ist, wie es deutlich in den Kommentaren [hier] (https://github.com/facebook/php-sdk/blob/master/examples/example.php) steht. _Wir wissen nicht ob es ist immer noch gültig, bis wir einen API-Aufruf mit der Sitzung machen. _ – ifaour

+0

in der Tat, meine schlechte, die Kommentare des Beispielcodes nicht richtig gelesen haben. Vielen Dank für Ihre Eingabe – flochtililoch

Antwort

0

Facebook sollte die Sitzung von dem Konto trennen, zu dem die Sitzung gehörte. Sie können Facebook :: getUser() verwenden, um zu überprüfen, ob dies geschehen war:

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

Der Methodencode getUser() basiert auf getSession(). Die Sitzung besteht nach einer standardmäßigen Facebook-Abmeldung weiterhin. öffentliche Funktion getUser() { $ session = $ this-> getSession(); Rückkehr $ Sitzung? $ session ['uid']: null; } – flochtililoch

0

$facebook->setSession(null) Versuchen oder Javascript <a href="/logout/" onclick="FB.logout();">Logout</a>

+1

Das würde funktionieren, wenn ich das Abmeldebit selbst handhabte ich schätze, aber ich habe keine Möglichkeit zu sagen, wenn Abmeldung von Facebook Logout-Menü getan wurde – flochtililoch

0

Logout verwendet keine Art und Weise tun Sie arbeiten.

Versuchen Sie, diesen Link in Ihrem Browser zu veröffentlichen, nachdem Sie sich bei Facebook eingeloggt haben.

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

Was passiert? es bringt Sie zu Ihrem Facebook. Kein Abmelden.

Was auch immer Sie tun, überprüfen Sie die Funktion (hängt von Ihrer API ab) handleLogout und überprüfen Sie die Ausgabe. In meinem Fall gibt es die gesamte Facebook-HTML-Seite zurück.

1

Probieren Sie die Formatfunktion irgendwo im Loginwindow zu finden (AS3) und finden Sie die folgende Zeile:.

vars.redirect_uri = FacebookURLDefaults.LOGIN_SUCCESS_URL 

Ändern Sie den Wert für http://www.facebook.com/ und von dieser HTML-Seite abzumelden, wenn angemeldet

Dies ist ein temporäre Lösung zum Abmelden, wenn Sie Entwickler sind, nicht der Endbenutzer.

7

Ich benutze $ fb-> getUser() und was ich tat war fast identisch mit Ihren.

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

Ich fand, dass nur API zu überprüfen, ob FB abgemeldet oder nicht manchmal widersprüchlich, aber mit destroySession(), die Sitzung sicher zerstört wird.

+2

Ich versuchte, aber fehlgeschlagen .. wenn der Benutzer von seinem abgemeldet/ihr facebook (nicht aus der anwendung) $ fb-> getUser() gib immer noch die uid. Selbst wenn ein neuer Benutzer sich in Facebook eingeloggt hat, gibt die $ fb-> getUser() immer noch die alte uid zurück. –

0

Der einzige Weg, ich habe es geschafft, dieses Problem zu lösen war durch die Sitzung Löschen des unterschriebenen Antrag mit der Benutzer-ID zu überprüfen:

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