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>