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>