Facebook Oauth Logout

70

Ich habe eine Anwendung, die mit Oauth 2 in Facebook integriert wird.

Ich kann mit FB autorisieren und ihre REST- und Graph-APIs perfekt abfragen, aber wenn ich autorisiere, wird mit FB eine aktive Browsersitzung erstellt. Ich kann mich dann problemlos von meiner Anwendung abmelden, aber die Sitzung mit FB bleibt bestehen. Wenn also jemand anderes den Browser verwendet, wird das FB-Konto des vorherigen Benutzers angezeigt (es sei denn, der vorherige Benutzer meldet sich ebenfalls manuell vom FB ab).

Die Schritte, die ich zur Autorisierung unternehme, sind:

  1. Rufen Sie [LINK: graph.facebook.com/oauth/authorize?client_id ...] auf.

Dieser Schritt öffnet ein Facebook-Anmelde- / Verbindungsfenster, wenn der Browser des Benutzers noch keine aktive FB-Sitzung hat. Sobald sie sich bei Facebook angemeldet haben, leiten sie mit einem Code, den ich gegen ein Oauth-Token eintauschen kann, auf meine Website weiter.

  1. Rufen Sie [LINK: graph.facebook.com/oauth/access_token?client_id ..] mit dem Code von (1) auf.

Jetzt habe ich ein Oauth-Token und der Browser des Benutzers ist auf meiner Site und in FB angemeldet.

  1. Ich rufe eine Reihe von APIs auf, um Dinge zu erledigen: dh [LINK: graph.facebook.com/me?access_token= ..]

Nehmen wir an, mein Benutzer möchte sich von meiner Website abmelden. Die FB-Nutzungsbedingungen verlangen, dass ich Single Sign Off durchführe. Wenn sich der Benutzer von meiner Website abmeldet, werden sie auch von Facebook abgemeldet. Es gibt Argumente, dass dies ein bisschen dumm ist, aber ich bin gerne bereit, dem nachzukommen, wenn es eine Möglichkeit gibt, dies tatsächlich zu erreichen.

Ich habe Vorschläge gesehen, die:

A. Ich verwende die Javascript-API zum Abmelden: FB.Connect.logout (). Nun, ich habe versucht, das zu verwenden, aber es hat nicht funktioniert, und ich bin mir nicht sicher, wie es genau sein könnte, da ich die Javascript-API auf meiner Website in keiner Weise verwende. Die Sitzung wird nicht von der Javascript-API verwaltet oder erstellt, daher bin ich mir nicht sicher, wie sie ablaufen soll.

B. Verwenden Sie [LINK: facebook.com/logout.php]. Dies wurde vor einiger Zeit von einem Administrator in den Facebook-Foren vorgeschlagen. Das Beispiel bezog sich auf die alte Art, FB-Sitzungen zu erhalten (nicht oauth), daher glaube ich nicht, dass ich es in meinem Fall anwenden kann.

C. Verwenden Sie die alte REST-API expireSession oder revokeAuthorization. Ich habe beide ausprobiert und während sie das Oauth-Token ablaufen lassen, machen sie die Sitzung, die der Browser derzeit verwendet, nicht ungültig, sodass sie keine Auswirkungen hat. Der Benutzer ist nicht von Facebook abgemeldet.

Ich bin wirklich ein bisschen am Ende, die Facebook-Dokumentation ist lückenhaft, mehrdeutig und ziemlich schlecht. Die Unterstützung in den Foren ist nicht vorhanden, im Moment kann ich mich nicht einmal im Facebook-Forum anmelden, und abgesehen davon funktioniert die eigene FB Connect-Integration nicht einmal im Forum selbst. Inspiriert nicht viel Vertrauen.

Ta für jede Hilfe, die Sie anbieten können. Derek

ps. Musste HTTPS in LINK ändern, nicht genug Karma, um Links zu posten, was wahrscheinlich fair genug ist.

Derek Troy-West
quelle
1
Sean hat einen Punkt, auf den du hören solltest, weil er mehr Ansehen hat als du, und das macht ihn richtig. Wenn ich bei Facebook angemeldet bin, dann komme ich zu Ihrer Website, benutze sie (oder entscheide mich einfach, in bitterer Enttäuschung zu gehen) und melde mich dann ab. Ich wäre überrascht und vielleicht sogar ein wenig empört, wenn ich sie finden würde wurde auch von Facebook abgemeldet. Wenn die Benutzeroberfläche klargestellt hat, dass dies passieren würde, ist das in Ordnung, aber wenn es nur eine Schaltfläche in der oberen rechten Ecke der Seite ist, auf der "Abmelden" steht, möglicherweise mit einem Facebook-Logo in der Nähe, ist das ziemlich überraschend. Überraschung ist kein Merkmal einer guten Benutzeroberfläche.
Tom Anderson
5
@ Tom: developer.facebook.com/policy Line # 6.
Mike Purcell
@DigitalPrecision: Ein ausgezeichneter Link, der zeigt, dass nicht einmal Facebook dies richtig machen kann.
Tom Anderson
2
Einverstanden. Wir mussten durch die Reifen springen, damit es in unserer Anwendung funktioniert. Docs sind schrecklich.
Mike Purcell
Ich habe genau das gegenteilige Problem: Wenn ich mich von meiner selbst erstellten App abmelde, werde ich auch sofort von Facebook abgemeldet.
Sliq

Antworten:

43

Ich habe das gleiche Problem. Ich melde mich auch mit oauth an (ich verwende RubyOnRails), aber zum Abmelden mache ich es mit JavaScript über einen Link wie diesen:

<a href="/logout" onclick="FB.logout();">Logout</a> 

Dies ruft zuerst die onclickFunktion auf und führt eine Abmeldung auf Facebook durch, und dann wird die normale /logoutFunktion meiner Site aufgerufen.

Ich würde zwar auch eine serverseitige Lösung bevorzugen, aber sie macht zumindest das, was ich will, und meldet mich an beiden Standorten ab.

Ich bin auch ziemlich neu in der Facebook-Integration und habe das erste Mal damit gespielt, aber mein allgemeines Gefühl ist, dass die Dokumentation mit vielen veralteten Sachen ziemlich weit verbreitet ist.

Christoph
quelle
Danke Christoph! Ich habe das versucht und es funktioniert tatsächlich. Ich hatte zuvor versucht, FB.Connect.logout und FB.Connect.logoutAndRedirect zu verwenden, die meiner Meinung nach aus einer älteren Version der API stammen. Wie Sie sagen, ist die Dokumentation ziemlich fragmentiert. Nur um hinzuzufügen - bevor ich FB.logout aufrief, musste ich FB.init aufrufen, wie auf der FB Javascript API-Seite dokumentiert. Danke für Ihre Hilfe.
Derek Troy-West
Nach dem Update funktioniert diese Lösung in Chrome (mindestens 5.0.375) auf einem Mac nicht. Der Benutzer ist nicht von FB abgemeldet, funktioniert aber gut in Safari und Firefox.
Derek Troy-West
Meine Abmeldeseite musste einige FB-Anmeldeprüfungen durchführen. Der OnBick von FB.logout () wurde vor der Umleitung nicht schnell genug abgeschlossen. Ich musste die Umleitung verzögern, um sicherzustellen, dass FB.logout () zuerst erfolgreich abgeschlossen wurde.
bcm
18

Dies funktioniert ab sofort - und ist auf der Facebook-Website unter http://developers.facebook.com/docs/authentication/ dokumentiert . Ich bin mir nicht sicher, wie kürzlich es zur Dokumentation hinzugefügt wurde. Ich bin mir ziemlich sicher, dass es nicht vorhanden war, als ich im Februar 2012 nachgesehen habe

Sie können den Benutzer von Facebook programmgesteuert protokollieren, indem Sie ihn an weiterleiten

https://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN

russau
quelle
5
Kann das nicht zum Laufen bringen. Verwenden der serverseitigen Verbindungsmethode. Wenn der Dokumentationslink einmal auf diese Methode verwiesen hat, ist dies nicht mehr der Fall.
Daniel Gerson
@DanielGerson Wenn Sie ssc verwenden, erhalten Sie das Zugriffstoken als Antwort von Facebook. Dies funktioniert, wenn Sie das Zugriffstoken an den Client senden, damit der Client es im Abmeldelink verwenden kann.
Reiner
18

Diese Lösung funktioniert nicht mehr mit der aktuellen API von FaceBook (anscheinend war sie zunächst nicht beabsichtigt).

http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com;

Versuchen Sie, diesen Link auf Ihrem Abmeldelink oder der Schaltfläche anzugeben, auf der "yoursitename.com" angezeigt wird, wo Sie nach dem Abmelden möglicherweise Ihre Startseite zurückleiten möchten.

Es klappt..

sumit
quelle
Sumit, danke. Das funktioniert perfekt. Ich bin mir nicht ganz sicher, warum Sie sich mit der mobilen Version von Facebook so abmelden können, während die andere dies nicht tut, aber es ist mir egal. Es ist besser als der jscript-Hack, den ich gerade verwende, und einfacher als der hier beschriebene Haupt-Facebook-Abmelde- und Sitzungsschlüssel.
Derek Troy-West
5
Aber was ist, wenn der Benutzer nicht möchte, dass seine Facebook-Sitzung zerstört wird? Was ist, wenn sie bereits bei Facebook angemeldet waren, sich dann bei Ihrer Website anmelden, sich dann von Ihrer Website abmelden und dann zu Facebook zurückkehren und nicht verstehen, warum sie gerade abgemeldet wurden? Dies scheint nicht die perfekte Lösung zu sein ...
Sean
2
Als diese Frage vor einigen Monaten gestellt wurde, war das einmalige Abmelden eine Anforderung der Facebook-Nutzungsbedingungen. Ich bin mir nicht sicher, ob es noch so ist, und ich bin nicht anderer Meinung als Sie, aber zu der Zeit war es erforderlich.
Derek Troy-West
siehe meine Lösung unten für etwas, das ab sofort funktioniert und von Facebook dokumentiert wird
russau
5

Sie können dies tun mit access_token:

$access_array = split("\|", $access_token);

$session_key = $access_array[1];

Sie können dies $session keyim PHP SDK verwenden, um eine funktionale Abmelde-URL zu generieren.

$logoutUrl = $facebook->getLogoutUrl(array('next' => $logoutUrl, 'session_key' => $session_key));

Damit ist die Facebook-Sitzung des Browsers beendet.

Zach Greenberger
quelle
Sie müssen nicht manuell mit Token arbeiten, da $ facebook es bereits hat.
Zerkms
Können Sie näher erläutern, was Sie meinen? Diese Methode ist die einzige, die ich gefunden habe, um den Benutzer abzumelden und die FB-Sitzung ohne Verwendung von Javascript zu beenden
Zach Greenberger
2
Bob, hier ist die Struktur der Abmelde-URL: facebook.com/… > Wobei session_key der mittlere Teil des Zugriffstokens ist, wie oben beschrieben.
Zach Greenberger
Wie @Amir hervorhob, entspricht der Sitzungsschlüssel dem "Code", den Sie während der ersten OAuth-Autorisierung von Facebook erhalten haben. Verwenden Sie diesen besser, als zu versuchen, das Zugriffstoken zu analysieren (da sich das Format des Tokens ändern könnte).
Anders Fjeldstad
Mit der gleichen Methode, die Zach verwendet hat. Hier ist , wie eine komplette Abmeldung in RoR + + Devise Omniauth zu tun github.com/intridea/omniauth/wiki/...
Dex
1

Mit PHP mache ich:

<a href="?action=logout">logout.</a>

if(isset($_GET['action']) && $_GET['action'] === 'logout'){
    $facebook->destroySession();
    header(WHERE YOU WANT TO REDIRECT TO);
    exit();
}

Funktioniert und ist nett und einfach Ich versuche gerade, eine Abmeldeschaltflächengrafik zu finden!

Mike Wells
quelle
1

Hier ist eine Alternative zu der akzeptierten Antwort, die in der aktuellen (2.12) Version der API funktioniert.

<a href="#" onclick="logoutFromFacebookAndRedirect('/logout')">Logout</a>

<script>
    FB.init({
        appId: '{your-app-id}',
        cookie: true,
        xfbml: true,
        version: 'v2.12'
    });

    function logoutFromFacebookAndRedirect(redirectUrl) {
        FB.getLoginStatus(function (response) {
            if (response.status == 'connected')
                FB.logout(function (response) {
                    window.location.href = redirectUrl;
                });
            else
                window.location.href = redirectUrl;
        });
    }
</script>
Pluc
quelle
0

Die von Sumit vorgeschlagene mobile Lösung funktioniert perfekt für AS3 Air:

html.location = "http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com"

shi11i
quelle
0

Für Python-Entwickler, die Benutzer direkt vom Backend abmelden möchten

Im Moment schreibe ich dies, den Trick mit m.facebook.com funktioniert nicht mehr (zumindest für mich) und der Benutzer wird auf die Anmeldeseite für mobile FB umgeleitet, was offensichtlich nicht gut für UX ist.

Glücklicherweise hat das FB PHP SDK eine halb dokumentierte Lösung (falls der Link nicht zur getLogoutUrl()Funktion führt, suchen Sie einfach auf dieser Seite danach). Dies wird auch in mindestens einem anderen auf StackOverflow erwähnt: Facebook PHP SDK getLogoutUrl () Problem .

Übrigens habe ich gerade bemerkt, dass Zach Greenberg es in dieser Frage richtig gemacht hat , aber ich füge meine Antwort als Zusammenfassung für Python-Entwickler hinzu.

Tomasz Zieliński
quelle
0

Ein Hinweis für Christophs Antwort: Facebook Oauth Logout Die Logout-Funktion erfordert die Angabe einer Rückruffunktion und schlägt zumindest unter Firefox ohne diese Funktion fehl. Chrome funktioniert ohne Rückruf.

FB.logout(function(response) {});
zoli
quelle
0

@Christoph: nur etwas hinzufügen. Ich glaube nicht, dass dies der richtige Weg ist, sich an beiden Orten gleichzeitig abzumelden. ( <a href="https://stackoverflow.com/logout" onclick="FB.logout();">Logout</a>).

Just add id to the anchor tag . <a id='fbLogOut' href="https://stackoverflow.com/logout" onclick="FB.logout();">Logout</a>



$(document).ready(function(){

$('#fbLogOut').click(function(e){ 
     e.preventDefault();
      FB.logout(function(response) {
            // user is now logged out
            var url = $(this).attr('href');
            window.location= url;


        });
});});
Muhammad Sohail
quelle
0

Update: Diese Lösung funktioniert und nur ein Aufruf von 'FB.logout ()' funktioniert nicht, da der Browser möchte, dass eine Benutzerinteraktion diese Funktion tatsächlich aufruft, damit er weiß - es ist ein Benutzer, kein Skript.

<a href="#" onclick="FB.logout();">Logout</a> 
halkujabra
quelle
-8

Es ist einfach, geben Sie einfach Folgendes ein: $ facebook-> setSession (null); zum Abmelden

Saiful Amri
quelle