Запутался в природе JS SDK Facebook Events

У меня возникли проблемы с разработкой механизма входа/выхода пользователей на моем веб-сайте, который работает с 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>

person Casey Flynn    schedule 09.08.2011    source источник
comment
способны делать то, что вы намеревались сделать. Даже я пытаюсь сделать что-то подобное, и я не могу правильно выйти из системы и оставить его в системе. Автоматически он входит в систему.   -  person John Doe    schedule 29.03.2013


Ответы (1)


Я бы рекомендовал использовать один и тот же обратный вызов для всех методов. Таким образом, вы получаете один путь кода аутентификации, о котором нужно беспокоиться. Вот так: (что не так уж далеко от предоставленного вами кода)

function authCallback(response) {
    if(response && response.session){
        if(window.module.Globals.prototype.oauth_uid != response.session.uid){
            //authenticated user with invalid session
            window.module.VCAuth.prototype.session_login();
        }
    }else{
        if(window.module.Globals.prototype.oauth_uid){
            //unauthenticated user with authenticated session
            window.module.VCAuth.prototype.session_logout();
        }
    }
}

FB.getLoginStatus( authCallback );
FB.Event.subscribe('auth.login', authCallback);
FB.Event.subscribe('auth.logout', authCallback);

Вы сказали, что одна из основных проблем:

ОБА событие auth.login и событие FB.getLoginStatus() срабатывают.

Просто убедитесь, что session_logout() и session_login() устанавливают/сбрасывают oauth_uid перед выполнением асинхронного вызова сервера, чтобы при следующем вызове обратного вызова было установлено правильное состояние VCAuth.

Примечание. auth.logout не запускается при каждой загрузке страницы, потому что auth.logout подразумевает, что пользователь вошел в систему. Нет смысла запускать auth.logout, если пользователь никогда не входил в систему, верно?

Надеюсь это поможет.

person squinlan    schedule 13.08.2011