У меня возникли проблемы с разработкой механизма входа/выхода пользователей на моем веб-сайте, который работает с facebook.
Поведение некоторых событий Facebook кажется нелогичным:
auth.login срабатывает при каждой загрузке страницы, когда пользователь вошел в систему.
FB.getLoginStatus() срабатывает при каждой загрузке страницы, как я и ожидал
auth.logout срабатывает только тогда, когда пользователь фактически выходит из системы, и, в отличие от auth.login, auth.logout не срабатывает при каждой загрузке страницы, когда пользователь не вошел в систему.
Я хочу создать систему, которая определяет, считает ли сеанс пользователя, что пользователь вошел в Facebook. Если сеанс пользователя настроен на то, что он вошел в систему facebook, но на самом деле это не так, выполните ajax-вызов на сервер и обновите сеанс. Если сеанс и facebook js sdk согласны с тем, вошел ли пользователь в систему или нет, ничего не делайте. И если сеанс пользователя не знает, что пользователь вошел в систему facebook, но js sdk говорит, что это так, обновите сервер с помощью вызова ajax.
Я хочу создать приложение, которое синхронизируется с текущим статусом входа пользователя в facebook. И я хотел бы, чтобы это приложение входило/выходило из системы (путем выполнения ajax-вызова на мой сервер для обновления их сеанса) всякий раз, когда они изменяют статус facebook. Это сложно, так как я не могу надежно определить, когда пользователь входит или выходит из Facebook.
Одна конкретная проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь загружает страницу и входит в систему facebook, ОБА событие auth.login и события FB.getLoginStatus() срабатывают.
Мой последний вопрос: какую комбинацию событий facebook или общую стратегию я должен использовать для создания такого приложения. Хорошим примером того, что я собираюсь сделать, является реализация hulu.com входа через Facebook на свой веб-сайт. Спасибо, что прочитали это!
<script>
window.fbAsyncInit = function() {
FB.init({appId: '<?=$facebook_app_id?>',
status: true,
cookie: false,
xfbml: true});
FB.getLoginStatus(function(response) {
console.log('getLoginStatus');
console.log(response);
if(response.session){
if(window.module.Globals.prototype.oauth_uid != response.session.uid){
//authenticated user unknown to server, update server and set session
window.module.VCAuth.prototype.session_login();
}
}else{
if(window.module.Globals.prototype.oauth_uid){
//unauthenticated user with authenticated session, update server and unset session
window.module.VCAuth.prototype.session_logout();
}
}
});
FB.Event.subscribe('auth.login', function(response){
console.log('auth.login');
console.log(response);
});
FB.Event.subscribe('auth.logout', function(response){
console.log('auth.logout');
console.log('response');
});
};
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>