web-dev-qa-db-fra.com

FB.logout () appelé sans jeton d'accès

J'essaie de me déconnecter d'un site Web que j'ai créé avec Facebook intégré. La connexion fonctionne correctement, mais lorsque je veux me déconnecter, Firebug me donne systématiquement cette erreur:

FB.logout() appelée sans jeton d'accès.

J'utilise le SDK JavaScript de Facebook, et le code que je dois me déconnecter ressemble à ceci:

$(document).ready($(function () {
    $("#fblogout").click(facebooklogout);
}));

function facebooklogout() {
    FB.logout(function (response) {
    }
)};

Il s'agit du code de déconnexion spécifié dans Facebook Developers Documentation juste avec un bouton affecté à la méthode sur document.ready

Avant ce code, j'ai la méthode FB.init(), qui fonctionne bien.

Si quelqu'un a une solution pour expliquer pourquoi FB.logout n'a pas de jeton d'accès, ce serait apprécié.

32
martinthebeardy

Pour vous déconnecter de l'application qui utilise l'API Facebook graph, utilisez ce JavaScript sur la page de déconnexion juste après le <form> tag:

window.onload=function()
{
    // initialize the library with your Facebook API key
    FB.init({ apiKey: 'b65c1efa72f570xxxxxxxxxxxxxxxxx' });

    //Fetch the status so that we can log out.
    //You must have the login status before you can logout,
    //and if you authenticated via oAuth (server side), this is necessary.
    //If you logged in via the JavaScript SDK, you can simply call FB.logout()
    //once the login status is fetched, call handleSessionResponse
    FB.getLoginStatus(handleSessionResponse);
}

//handle a session response from any of the auth related calls
function handleSessionResponse(response) {
    //if we dont have a session (which means the user has been logged out, redirect the user)
    if (!response.session) {
        window.location = "/mysite/Login.aspx";
        return;
    }

    //if we do have a non-null response.session, call FB.logout(),
    //the JS method will log the user out of Facebook and remove any authorization cookies
    FB.logout(handleSessionResponse);
}

Le code fonctionne et est en direct sur mon site.

19
Balaji Birajdar

Je suis allé pour la solution moins triviale:

    function facebookLogout(){
        FB.getLoginStatus(function(response) {
            if (response.status === 'connected') {
                FB.logout(function(response) {
                    // this part just clears the $_SESSION var
                    // replace with your own code
                    $.post("/logout").done(function() {
                        $('#status').html('<p>Logged out.</p>');
                    });
                });
            }
        });
    }
12
Ozzy

J'ai essayé quelque chose comme ça:

function fbLogout(){
    if(typeof FB.logout == 'function'){
        if (FB.getAuthResponse()) {
         FB.logout(function(response) { window.location.href = PROJECT_PATH + '/index/logout'; }); 
         return;
        }  
    };

    window.location.href = PROJECT_PATH + '/index/logout'; 
    return;  
}
3

Devrait être quelque chose de plus comme ça. Il y a eu un changement dans l'API JS où vous devez utiliser authResponse au lieu de simplement session.

//handle a session response from any of the auth related calls
function handleSessionResponse(response) {

    //if we dont have a session (which means the user has been logged out, redirect the user)
    if (!response.authResponse) {
        return;
    }

    //if we do have a non-null response.session, call FB.logout(),
    //the JS method will log the user out of Facebook and remove any authorization cookies
    FB.logout(response.authResponse);
}
3
Eric Novins

L'erreur indique que vous n'avez pas de jeton d'accès, vous devez en rechercher un à l'aide de la fonction FB.getAccessToken ().

S'il n'y a pas de jeton d'accès, la fonction renvoie null. Voir l'exemple ci-dessous:

   function facebooklogout() {
    try {
        if (FB.getAccessToken() != null) {
            FB.logout(function(response) {
                // user is now logged out from facebook do your post request or just redirect
                window.location.replace(href);
            });
        } else {
            // user is not logged in with facebook, maybe with something else
            window.location.replace(href);
        }
    } catch (err) {
        // any errors just logout
        window.location.replace(href);
    }
   }
2
Mihai Crăiță

Je l'ai compris après tant d'essais. En fait, nous passons response à FB.logout.

Généralement response.authResponse.accessToken contient un jeton. Donc, son erreur sur le accessToken n'est pas là.

Pensez logiquement, d'où vient cette réponse dans votre code? Sorti de nul part.

Donc, nous devons obtenir cet objet de réponse à partir d'une fonction et le transmettre à la fonction de déconnexion. Je ne sais pas comment cela a fonctionné pour les autres, mais cela a fonctionné pour moi.

Remplacez simplement le code par celui-ci

function logout(){
  FB.getLoginStatus(function(response) {
    FB.logout(function(response){
      console.log("Logged Out!");
      window.location = "/";
    });
  });
}

Ce que nous faisons ici, c'est obtenir le statut de connexion si l'utilisateur est connecté et obtenir la réponse correspondante en retour, qui contient tous les jetons et les données nécessaires. Et puis, nous transmettons cette réponse à la fonction de déconnexion.

1
Sumit Badsara