FB JS-SDK не может обнаружить выход пользователя из FB напрямую

TL;DR Facebook javascript SDK не может определить точный статус входа в систему пользователя, который напрямую вышел из facebook.com под ним.

Я разрабатываю приложение Facebook, используя SDK javascript для аутентификации. Я заметил, что, когда пользователь выходит из Facebook напрямую (на facebook.com), SDK не может понять состояние входа пользователя на странице приложения. Я свел это к следующему простому тестовому примеру.

Войдите на facebook.com в одной вкладке. На другой вкладке отобразите страницу приложения ниже (заменив MY_APP_ID соответствующим образом). Если вы вошли в Facebook как пользователь, который никогда не давал разрешений этому приложению, нажмите «Войти» и предоставьте их. В любом случае вы должны увидеть некоторые события, указывающие на то, что вы вошли в систему.

Теперь вернитесь на вкладку facebook.com и выйдите из Facebook. Перейдите на вкладку приложения и нажмите все кнопки (кроме «Войти») и посмотрите на вывод консоли браузера.

  • При вызове FB.logout ничего не происходит. Обратный вызов никогда не вызывается. В Chrome выдается следующая ошибка: «Небезопасная попытка JavaScript получить доступ к фрейму с URL-адресом http://my_app.com из фрейма с URL-адресом http://www.facebook.com/. Домены, протоколы и порты должны совпадать."

  • Когда вызывается FB.getLoginStatus, ответ говорит «подключено» и содержит объект authResponse. Однако это бесполезно, потому что теперь это неверно. Если вместо этого для параметра «force» передается значение true, то ничего не происходит (обратный вызов никогда не вызывается).

  • При вызове FB.getAuthResponse ничего не происходит (обратный вызов никогда не вызывается).

  • Ни одно из соответствующих событий не запускается во время этого (после выхода из Facebook).

Проблема в том, что в таком случае, по-видимому, невозможно законно определить статус входа пользователя в SDK. Или я делаю какую-то глупость, хотя и свела ее к минимуму.

Моя конечная цель здесь заключается в том, что я хочу иметь возможность сделать что-то в этом случае, если пользователь нажмет мою кнопку выхода после того, как уже вышел из Facebook. Но SDK не дает реальных средств для достижения этого.

Любые идеи или мысли? Кто-нибудь еще сталкивался с этим и нашел обходной путь? Спасибо!

Простая страница приложения:

<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:fb='http://www.facebook.com/2008/fbml'>
<head>
</head>
<body>
<script>
  window.fbAsyncInit = function() {
    function subFBEvent(name) {
      FB.Event.subscribe(name, function(r) {
        console.log(name);
        console.log(r);
      });
    }
    subFBEvent('auth.login');
    subFBEvent('auth.logout');
    subFBEvent('auth.authResponseChange');
    subFBEvent('auth.statusChange');
    FB.init({
      appId  : 'MY_APP_ID',
      status : true, // check login status
      cookie : true, // enable cookies to allow the server to access the session
      xfbml  : true,  // parse XFBML
      oauth  : true       // use OAuth 2.0
    });
  };
  (function() {
    var s = document.createElement('div'); 
    s.setAttribute('id','fb-root'); 
    document.documentElement.getElementsByTagName("body")[0].appendChild(s);
    var e = document.createElement('script');
    e.src = 'http://connect.facebook.net/en_US/all.js';
    e.async = true;
    s.appendChild(e);
  }());
</script>
<button onclick="FB.logout(function(r) { console.log('FB.logout'); console.log(r); });">Logout</button>
<button onclick="FB.getLoginStatus(function(r) { console.log('FB.getLoginStatus'); console.log(r); });">LoginStatus</button>
<button onclick="FB.getAuthResponse(function(r) { console.log('FB.getAuthResponse'); console.log(r); });">AuthResponse</button>
<fb:login-button>Login</fb:login-button>
</body>

person Steve A    schedule 22.10.2011    source источник
comment
Просто принудительное обращение к серверам Facebook. Посмотрите на заголовок stackoverflow.com/questions/9482876/   -  person Delmo    schedule 26.04.2013


Ответы (2)


Я не думаю, что это решение поможет вам сейчас, но я публикую его, чтобы другим не было так тяжело. Это потому, что вы неправильно реализуете метод FB.getLoginStatus. все, что вам нужно сделать, это реализовать этот метод

 FB.getLoginStatus(function(response) {
    statusChangeCallback(response);
  });

после вызова инициализации. Этот метод вызовет метод statusChangeCallback и выполнит аутентификацию.

function statusChangeCallback(response) {
    console.log('statusChangeCallback');
    console.log(response);
    // The response object is returned with a status field that lets the
    // app know the current login status of the person.
    // Full docs on the response object can be found in the documentation
    // for FB.getLoginStatus().
    if (response.status === 'connected') {
      // Logged into your app and Facebook.
      testAPI();
    } else if (response.status === 'not_authorized') {
      // The person is logged into Facebook, but not your app.
      document.getElementById('status').innerHTML = 'Please log ' +
        'into this app.';
    } else {
      // The person is not logged into Facebook, so we're not sure if
      // they are logged into this app or not.
      document.getElementById('status').innerHTML = 'Please log ' +
        'into Facebook.';
    }
  }

для получения дополнительной информации вы можете обратиться к этой странице официальной документации https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.0

person Mightian    schedule 19.06.2014
comment
Это не работает. Простой тест- авторизуйтесь на своей странице. запустите FB.getLoginStatus и обратите внимание на ответ. На другой вкладке выйдите из Facebook, вернитесь на свою страницу и повторно запустите команду — что касается API, вы все еще вошли в систему. Обновите свою страницу, повторно запустите FB.getLoginStatus — наконец, страница заметит. - person mseddon; 15.07.2014
comment
да, он не постоянно пингует сервер fb, чтобы узнать статус, но когда вы вызываете fb api, он проверяет и работает таким образом. - person Mightian; 16.07.2014
comment
На самом деле, изменив ваш FB.getLoginStatus на дополнительный параметр true, статус будет запрашиваться напрямую, решая проблему. - person mseddon; 17.07.2014
comment
пожалуйста, дайте мне знать, где добавить это, чтобы это было полезно другим - person Mightian; 17.07.2014
comment
То, как я это сделал, находится внутри моего обработчика кликов «вход в систему» ​​do FB.getLoginStatus(function() { ... FB.login(...) ... }, true), который, кажется, заставляет statusChangedCallback успешно видеть изменение во время вызова входа в систему. Надеюсь, это имеет смысл. - person mseddon; 17.07.2014

Прежде всего: почему именно вы хотите это сделать?

Вход через Facebook — это, по сути, просто удобство для пользователей Facebook, позволяющее избежать заполнения формы регистрации или входа на вашей веб-странице. Он позволяет легко настроить сеанс пользователя на вашем собственном веб-сайте, но, насколько я знаю, он не дает вам никакого права напрямую выходить из сеанса пользователя на Facebook (или на любых других сайтах с поддержкой входа через Facebook, таких как Stackoverflow). ). Это также работает и наоборот: если пользователь выходит из Facebook, это не означает, что он должен потерять все другие сеансы, установленные через вход в Facebook.

person dokaspar    schedule 31.08.2012