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>