web-dev-qa-db-fra.com

Statut de retour FB.getLoginStatus inconnu

Lorsque vous appelez FB.getLoginStatus à l'aide d'une application Facebook valide, le statut de la réponse est toujours inconnu. La réponse exacte est {authResponse: undefined, status: "unknown"}.

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


Exemple d’URL: http://media.tuentifotos.com/simple_test.html


Voici une capture d'écran des paramètres de l'application Facebook. Facebook App Settings

15

Cela se produisait pour moi dans Chrome, et ce parce que Chrome était configuré pour bloquer les cookies et les données de tiers.

Une fois la configuration modifiée, FaceBook peut me connecter à mon application sans problème.

  • Paramètres Chrome
  • Afficher les paramètres avancés...
  • Intimité
  • Paramètres de contenu ...
  • décocher Bloquer les cookies tiers et les données du site
16
Flimzy

Lorsque j'ai vérifié, le statut indique "not_authorized" et c'est bien, car je n'ai pas encore autorisé l'application.

Pour compléter le flux, vous devez ajouter le FB.login chaque fois que l'identifiant de l'utilisateur n'est pas autorisé ou n'est pas connecté à Facebook:

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

Pour moi, cela signifiait "sur ma page de connexion", je devais spécifier des cookies.

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

Mais ne me demandez pas pourquoi c'était le cas. Il a également corrigé le fait de devoir cliquer deux fois sur le bouton de connexion pour se connecter réellement, et ne nécessite même pas d'appId, apparemment, FWIW ...

3
rogerdpack

Moi aussi j'ai fait face à ce problème dans Chrome. Cependant, dans Firefox, cela fonctionnait comme prévu avec le statut retourné sous la forme connected lorsque l'utilisateur s'était déjà connecté.

J'ai trouvé un indice à ce sujet à partir d'une réponse à la question similaire ici .

La cause principale de ce problème est que, sur FB.logout(), Chrome ne supprime pas le cookie fblo_<your-app-id> qui affecte en quelque sorte la fonction FB.getLoginStatus() pour renvoyer unknown.

Correction: en appelant FB.logout(), vous pouvez supprimer par programme le cookie fblo_<your-app-id>

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

J'ai eu le même problème, j'ai résolu ce problème en effaçant tout le cache et les cookies.

0
divyanshu

J'ai eu le même problème dans IE. La réponse de Flimzy m'a fait réfléchir. J'ai essayé de lancer IE en tant qu'administrateur et cela a fonctionné.

0
Dennis Calla

La réponse finale

Ok, donc je pense avoir enfin compris ce foutu problème.

Que souhaitez-vous savoir:

1) Vous vous authentifiez avec Facebook via un identifiant d'application. Cela définit divers cookies, où votre ID d'application est marqué à la fin:

  • fblo_000000000000
  • fbm_000000000000
  • fbsr_000000000000

2) Si vous supprimez ces cookies, vous êtes toujours authentifié auprès de facebook en tant qu'utilisateur régulier (sauf si vous vous déconnectez complètement). Et sur les serveurs de Facebook, ils savent toujours que vous êtes autorisés sur cette application.

  • Ainsi, lorsque vous exécuterez à nouveau FB.getLoginStatus(), il les recréera et les remettra à nouveau. Ce n'est pas ce que votre utilisateur attend. C'est mauvais. Ils ont cliqué sur 'Déconnexion'.

3) Les docs disent explicitement ceci :

L'utilisateur n'est soit pas connecté à Facebook, soit explicitement déconnecté de votre application. Il ne tente donc pas de se connecter à Facebook. Nous ne savons donc pas s'il a authentifié votre application ou non. (inconnu)

Ils ne tentent donc même pas de vérifier si ce cookie est défini. C'est pourquoi vous obtenez nul ou indéfini. Ainsi, le cookie fblo est considéré comme un "opt-out". Vous n'êtes pas réellement déconnecté (e) par ce qu'une personne ordinaire considérerait comme étant déconnectée. Il y a juste un cookie disant que vous l'êtes! Bien sûr, si l'utilisateur se reconnecte avec le bouton de connexion, le cookie sera supprimé, ce que vous et votre utilisateur souhaitez.

Par conséquent, je pense que la seule chose à faire (si vous avez vraiment besoin de connaître le statut de l'utilisateur) est de:

  • Vérifiez manuellement l’existence du cookie fblo_<APPID> avant d’exécuter le FB.getLoginStatus.
  • Si le cookie n'existe pas, ne faites rien et exécutez votre flux normal.
  • Si le cookie existe, vous avez plusieurs options:

1) Option 1

Ne fais absolument rien. Vous comprenez maintenant le problème, vous comprenez ne pas supprimer le cookie et vous n'avez peut-être pas besoin de faire autre chose que d'afficher le bouton de connexion Facebook. 

2) Option 2 

Vous supposez que la personne est un utilisateur de votre application et faites tout ce que vous devez faire pour afficher l'interface utilisateur. Mais vous n'utiliserez pas votre logique normale complète - ce sera une application spécifique à vous.

3) option 3 

  • Définissez manuellement la valeur du cookie fblo_<APPID> sur n (au lieu de 'y'). N'oubliez pas que ce cookie est défini sur votre domaine, vous permettant donc de le modifier. * En fonction de votre environnement de développement, cela peut varier, mais cela doit être fait côté client et vous devrez peut-être spécifier le chemin de `/ 'et votre domaine de cookie).
  • Exécutez la getLoginStatus(..., true) - elle ne sera plus bloquée car le cookie est maintenant n. Cependant, vous ne devez pas exécuter votre logique normale ici - car tout ce que vous voulez, c'est vérifier si l'utilisateur est réellement un utilisateur de Facebook et/ou toujours authentifié avec votre application. 
  • Définissez manuellement la valeur du cookie sur y

Malheureusement, je ne peux pas recommander cette solution en raison de conditions de course étranges. Cela fonctionne presque, mais FB peut le casser à tout moment, délibérément ou accidentellement - et il finit par être confus en pensant que vous êtes vraiment connecté lorsque vous ne l'êtes pas. De plus, il pourrait avoir toutes sortes de complications avec d'autres plugins que je n'ai même pas observés.

J'aimerais que la getLoginStatus s'exécute toujours et donne des informations précises, mais c'est la seule vraie solution que je vois. Et c'est comme ça depuis 8 ans, donc je pense que nous sommes coincés avec ça.

4) Option 4 - Définissez votre propre cookie

  • Vous avez toujours la possibilité de définir vos propres cookies pour indiquer certaines choses, comme "cet utilisateur s'est connecté à un moment donné à Facebook" ou "cet utilisateur est authentifié avec mon application". Mais je suis prudent à ce sujet car cela peut rapidement devenir compliqué.

Incidemment, j'ai revisité ce problème parce que j'utilise le plugin Messenger pour mon site Web et je ne veux pas qu'il s'affiche du tout, sauf si je sais que la personne a un compte Facebook. J'ai donc besoin d'une réponse précise au statut de connexion.

0
Simon_Weaver