FB.logout () вызывается без токена доступа - PullRequest
32 голосов
/ 08 декабря 2011

Я пытаюсь выйти из веб-сайта, созданного с помощью Facebook. Вход в систему работает нормально, но когда я хочу выйти из системы, Firebug постоянно выдает мне эту ошибку:

FB.logout() вызывается без токена доступа.

Я использую Facebook JavaScript SDK, и код для выхода из системы выглядит следующим образом:

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

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

Это код выхода из системы, указанный в Документации для разработчиков Facebook только с помощью кнопки, которой назначен метод в document.ready

Перед этим кодом у меня есть метод FB.init(), который все работает нормально.

Если у кого-нибудь есть решение о том, почему FB.logout не имеет токена доступа, это будет оценено.

Ответы [ 6 ]

19 голосов
/ 08 декабря 2011

Чтобы выйти из приложения, использующего API-интерфейс Facebook Graph, используйте этот JavaScript на странице выхода сразу после тега <form>:

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);
}

Код работает и работает на моем сайте.

12 голосов
/ 12 августа 2014

Я выбрал менее тривиальное решение:

    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>');
                    });
                });
            }
        });
    }
3 голосов
/ 27 февраля 2012

Я пробовал что-то вроде этого:

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 голосов
/ 17 января 2012

Должно быть что-то вроде этого.Произошло изменение в JS API, где вы должны использовать authResponse вместо просто сессии

2 голосов
/ 31 декабря 2014

Ошибка говорит о том, что у вас нет токена доступа, вы должны проверить его с помощью функции FB.getAccessToken ().

Если токена доступа нет, функция возвращает ноль. Смотрите пример ниже:

   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);
    }
   }
0 голосов
/ 31 мая 2019

Разобрался после стольких попыток. На самом деле, мы передаем response в FB.logout.

Обычно response.authResponse.accessToken содержит токен. Итак, ошибка в том, что accessToken не существует.

Подумайте логически, откуда этот ответ приходит в вашем коде? Из ниоткуда.

Итак, нам нужно получить объект ответа из функции и передать его функции выхода из системы. Я не знаю, как это сработало для других, но это сработало для меня.

Просто замените код на этот

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

Что мы делаем здесь, так это получаем статус входа в систему, если пользователь вошел в систему, и получаем ответ в ответ, который содержит все необходимые токены и данные. И затем мы передаем этот ответ функции выхода из системы.

...