FB JS-SDK не може да открие директно излизане на потребител от FB

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>

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

след извикването на init. Този метод ще извика метод 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