it-swarm.com.de

FB.getLoginStatus gibt den Status unbekannt zurück

Beim Aufruf von FB.getLoginStatus über eine gültige Facebook-App ist der Antwortstatus immer unbekannt. Die genaue Antwort lautet {authResponse: undefined, Status: "unbekannt"}.

<html>
<body>
    <div id="fb-root"></div>

    <script>
    window.fbAsyncInit = function(){
        FB.init({ appId:'1484134468466778', status:true,  cookie:true, xfbml:true});
        FB.getLoginStatus(function(response){
        console.log(response);
        });
    };

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


Beispiel-URL: http://media.tuentifotos.com/simple_test.html


Hier ein Screenshot der Facebook-App-Einstellungen. Facebook App Settings

15

Dies war für mich in Chrome der Fall, weil Chrome so konfiguriert wurde, dass Cookies und Daten von Drittanbietern blockiert werden.

Sobald ich diese Konfigurationsänderung vorgenommen habe, kann FaceBook mich problemlos in meiner App anmelden.

  • Chrome-Einstellungen
  • Erweiterte Einstellungen anzeigen...
  • Privatsphäre
  • Inhaltseinstellungen...
  • deaktivieren Drittanbieter-Cookies und Websitedaten blockieren
16
Flimzy

Wenn ich ein Häkchen gemacht habe, zeigt der Status "not_authorized" und das ist in Ordnung, da ich die App noch nicht autorisiert habe.

Um den Ablauf abzuschließen, sollten Sie den FB.login hinzufügen, wenn die Benutzer-ID nicht autorisiert oder nicht bei Facebook angemeldet ist:

window.fbAsyncInit = function(){
    FB.init({ appId:'{APP-ID}', status:true,  cookie:true, xfbml:true});
    FB.getLoginStatus(function(response){
        if (response.status === 'connected') {
           //proceed
        } else if (response.status === 'not_authorized') {
           login();
        } else {
          login();
        }
    });
};

function login(){
   FB.login(function(response) {
      if (response.authResponse) {
         // proceed
      } else {
         // not auth / cancelled the login!
      }
   });
}
3
Sahil Mittal

Für mich bedeutete dies "auf meiner Anmeldeseite", dass ich Cookies angeben musste.

  window.fbAsyncInit = function() {
   FB.init({
      version: 'v2.8',
      cookie     : true,
    });
  };

Aber frag mich nicht warum das war der Fall. Es wurde auch behoben, dass der Login-Button zweimal angeklickt werden musste, um sich tatsächlich einzuloggen, und er benötigt nicht einmal eine appId, scheinbar FWIW ...

3
rogerdpack

Auch ich war in Chrome mit diesem Problem konfrontiert. In Firefox funktionierte es jedoch erwartungsgemäß mit dem Status, der als connected zurückgegeben wurde, als sich der Benutzer zuvor angemeldet hatte.

Ich fand einen Hinweis darauf aus einer Antwort auf die ähnliche Frage hier .

Die Hauptursache für dieses Problem ist, dass Chrome bei FB.logout() den Cookie fblo_<your-app-id> nicht entfernt, was die Funktion FB.getLoginStatus() irgendwie beeinträchtigt und unknown zurückgibt.

Fix: Beim Aufruf von FB.logout() können Sie das Cookie fblo_<your-app-id> programmgesteuert löschen.

FB.logout(function(response) {
  deleteCookie("fblo_" + fbAppId); // fblo_yourFBAppId. example: fblo_444499089231295
});

function deleteCookie(name) {
  document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}
3
Nagesh Andani

Die endgültige Antwort

Ok, ich denke, ich habe endlich dieses verdammte Problem herausgefunden.

Was du wissen musst:

1) Sie authentifizieren sich bei Facebook über eine App-ID. Dies setzt verschiedene Cookies, bei denen Ihre App-ID am Ende markiert ist:

  • fblo_000000000000
  • fbm_000000000000
  • fbsr_000000000000

2) Wenn Sie diese Cookies löschen, sind Sie weiterhin als regulärer Benutzer bei Facebook authentifiziert (sofern Sie sich nicht vollständig abmelden). Und auf den Servern von Facebook wissen sie immer noch, dass Sie für diese App berechtigt sind .

  • Wenn Sie also FB.getLoginStatus() erneut ausführen , werden sie nur neu erstellt und erneut abgelegt . Dies erwartet Ihr Benutzer nicht. Das ist schlecht. Sie klickten auf "Abmelden".

3) Die docs sagen dies ausdrücklich :

Der Benutzer ist entweder nicht bei Facebook angemeldet oder hat sich ausdrücklich von Ihrer Anwendung abgemeldet, sodass er nicht versucht, eine Verbindung zu Facebook herzustellen. Daher wissen wir nicht, ob er Ihre Anwendung authentifiziert hat oder nicht. (Unbekannt)

Sie versuchen also nicht einmal zu überprüfen, ob dieses Cookie gesetzt ist. Aus diesem Grund erhalten Sie null oder undefiniert. Das Cookie fblo wird also als "Opt-out" betrachtet. Sie sind NICHT WIRKLICH ABGELOGGT von dem, was eine normale Person als abgemeldet betrachten würde. Es gibt nur einen Cookie, der besagt, dass Sie es sind! Wenn sich der Benutzer wieder mit dem Anmeldebutton anmeldet, wird der Cookie gelöscht, was Sie und Ihr Benutzer möchten.

Daher glaube ich, dass das Einzige, was Sinn macht (wenn Sie den Status des Benutzers wirklich kennen müssen):

  • Überprüfen Sie das Vorhandensein von fblo_<APPID> - Cookies manuell, bevor Sie FB.getLoginStatus Ausführen.
  • Wenn das Cookie nicht vorhanden ist, tun Sie nichts und führen Sie Ihren normalen Flow aus.
  • Wenn das Cookie existiert, haben Sie mehrere Möglichkeiten:

1) Option 1

Tu absolut nichts. Sie verstehen jetzt das Problem, Sie verstehen, dass Sie den Cookie nicht löschen dürfen und müssen möglicherweise nichts anderes tun, als den Facebook-Anmeldebutton anzuzeigen.

2) Option 2

Sie nehmen an, dass die Person ein Benutzer Ihrer App ist, und tun, was Sie tun müssen, um die Benutzeroberfläche anzuzeigen. Sie werden jedoch nicht Ihre normale Logik ausführen - dies ist eine für Sie spezifische Anwendung.

3) Option 3

  • Setzen Sie den Cookie-Wert fblo_<APPID> Manuell auf n (anstelle von 'y'). Denken Sie daran, dass dieses Cookie in Ihrer Domain gesetzt ist, damit Sie es ändern können. * Abhängig von Ihrer Entwicklungsumgebung ist dies unterschiedlich, muss jedoch clientseitig durchgeführt werden, und Sie müssen möglicherweise den Pfad von "/" und Ihre Cookie-Domain angeben.
  • Führe die getLoginStatus(..., true) aus - sie wird jetzt nicht blockiert, da das Cookie jetzt n ist. Sie müssen hier jedoch nicht Ihre normale Logik ausführen , da Sie lediglich prüfen möchten, ob der Benutzer tatsächlich ein Facebook-Benutzer ist und/oder sich noch bei authentifiziert deine App.
  • Setzen Sie den Cookie-Wert manuell auf y zurück.

Leider kann ich diese Lösung aufgrund der verrückten Rennbedingungen nicht empfehlen. Sie funktioniert fast fast, aber FB kann sie jederzeit absichtlich oder versehentlich brechen - und Es wird immer noch verwirrt, wenn man denkt, dass man wirklich eingeloggt ist, wenn man nicht eingeloggt ist. Außerdem kann es zu Komplikationen mit anderen Plugins kommen, die ich noch nicht einmal beobachtet habe.

Ich wünschte, das getLoginStatus würde immer laufen und genaue Informationen liefern, aber dies ist die einzig wahre Lösung, die ich sehe. Und es ist seit 8 Jahren so, also denke ich, dass wir daran festhalten.

4) Option 4 - Setzen Sie Ihren eigenen Cookie

  • Sie haben immer die Möglichkeit, Ihre eigenen Cookies zu setzen, um bestimmte Dinge anzuzeigen, z. B. "Dieser Benutzer hat sich irgendwann bei Facebook angemeldet" oder "Dieser Benutzer ist mit meiner App authentifiziert". Aber ich bin vorsichtig, weil es schnell kompliziert werden kann.

Im Übrigen habe ich dieses Problem erneut behandelt, da ich das Messenger-Plugin für meine Website verwende und nicht möchte, dass es überhaupt angezeigt wird, es sei denn, ich weiß, dass die Person über ein Facebook-Konto verfügt. Ich benötige daher eine genaue Antwort auf den Anmeldestatus.

1
Simon_Weaver

Ich hatte das gleiche Problem. Ich habe dieses Problem behoben, indem der Cache und alle Cookies gelöscht wurden.

0
divyanshu

Ich hatte das gleiche Problem in IE. Flimzys Antwort brachte mich zum Nachdenken. Ich habe versucht, IE als Administrator auszuführen, und es hat funktioniert.

0
Dennis Calla