Запутанный природой JS SDK Facebook События - PullRequest
4 голосов
/ 09 августа 2011

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

1 Ответ

5 голосов
/ 13 августа 2011

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

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, если пользователь никогда не вошел в систему правильно

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

...