FB JS-SDK не может обнаружить выход пользователя из FB напрямую - PullRequest
9 голосов
/ 22 октября 2011

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

Я разрабатываю приложение Facebook, используя javascript SDK для аутентификации. Я заметил, что когда пользователь выходит из 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. Это не полезно, потому что теперь это неправильно. Если вместо этого передается значение true для параметра force, то ничего не происходит (обратный вызов никогда не вызывается).

  • Когда вызывается 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>

Ответы [ 2 ]

0 голосов
/ 19 июня 2014

Не думаю, что это решение поможет вам сейчас, но я выкладываю его, чтобы другим не пришлось так тяжело.Это потому, что вы неправильно реализуете метод 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

0 голосов
/ 31 августа 2012

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

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

...