Подтвердить что ты не робот

Вход в Facebook JS - FB.Event.subscribe('auth.login') триггеры без кнопки входа в систему

действительно нужна ваша помощь при входе в систему с функцией facebook, которую я пытаюсь реализовать на своем веб-сайте.

В основном, я пытаюсь добиться следующего:

  • если пользователь ранее подтвердил приложение и нажал кнопку входа FB на моем веб-сайте они регистрируются на веб-сайте (с веб-сайта пользователя учетная запись, связанная с идентификатором пользователя Facebook)

  • если пользователь еще не подтвердил это приложение, в журнале FB (и подписке на приложение) они перенаправляются на страницу регистрации веб-сайта. Здесь форма заполняется пользовательскими данными через Facebook и процесс регистрации становятся проще и быстрее.

Я использую код ниже.

<body>

<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function() {
        FB.init({
          appId: 'xxxxxxxx',
          status: true,
          cookie: true, 
          xfbml: true,
          oauth: true
        });

        FB.Event.subscribe('auth.login', function(response) {
              if (response.status === 'connected') {
                    var uid = response.authResponse.userID;
                    var accessToken = response.authResponse.accessToken;

                    if ((parseFloat(uid) == parseInt(uid)) && !isNaN(uid)) {
                        $.ajax({
                            url: '/user_actions/prep_facebook_registration',
                            cache: false,
                            type: 'POST',
                            data: { 'uid': uid, 'token': accessToken },
                            dataType: 'json',
                            success: function(data) {
                                if (data.success=='true') {
                                    if ((typeof(data.redirect) != 'undefined')) {
                                        window.location=data.redirect;
                                    }
                                }
                            }
                        });
                    }
              }
        });

        FB.Event.subscribe('auth.logout', function(response) {
            FB.getLoginStatus(function(res) {
                if (!res.authResponse) {
                    window.location='/access/logout';
                }
            });
        });

        FB.getLoginStatus(function(response) {
          if (response.status === 'connected') {
            var uid = response.authResponse.userID;
            var accessToken = response.authResponse.accessToken;
            //not doing anything so far
          }
        });
      };
            (function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
      }(document, 'script', 'facebook-jssdk'));
</script>

Кнопка входа в систему располагается на веб-сайте:

<div class="fb-login-button" autologoutlink="true" data-show-faces="false" data-width="166" data-max-rows="1" style="position: absolute; top: 5px; right: 0;" scope="email"></div>

Проблема заключается в том, что FB.Event.subscribe('auth.login') запускает не только кнопку входа в систему FB, но также, если пользователь зарегистрировался в Facebook и только после этого приходит на мой сайт. Это вызывает перенаправление на страницу регистрации или текущую перезагрузку страницы, даже если пользователь не нажал кнопку входа в систему!

'/user_actions/prep_facebook_registration' содержит script, который проверяет, должен ли элемент быть перенаправлен на страницу регистрации или должен быть зарегистрирован в локальной учетной записи. Он возвращает URL-адрес для перенаправления.

Что я делаю неправильно? Как я могу избежать запуска FB.Event.subscribe('auth.login') вне кнопки входа в систему?

4b9b3361

Ответ 1

=====================

Изменить: Хорошо, я думаю, что здесь немного прогресса:)

Я расширил кнопку входа в FB с событием onlogin, которое вызывает функцию JS Facebook_login()

<div class="fb-login-button" onlogin="Facebook_login()" autologoutlink="true" [parameters]></div>

Я экспортировал переменные uid и accessToken вне функции window.fbAsyncInit, чтобы я мог обращаться к ним из любого другого места:

var uid;
var accessToken;

window.fbAsyncInit = function() {
   FB.init({
      your parameters
   });
});

Затем я получил FB.Event.subscribe('auth.login'), чтобы присваивать значения только моим переменным uid и accessToken, но не выполнять перенаправление.

FB.Event.subscribe('auth.login', function(response) {
  if (response.status === 'connected') {
    uid = response.authResponse.userID;
    accessToken = response.authResponse.accessToken;
  }
});

И наконец, моя пользовательская функция Facebook_login() извлекает значения uid и accessToken и выполняет оставшуюся часть операции. На этот раз это происходит только при нажатии кнопки входа в систему. Обратите внимание, что эта функция находится вне window.fbAsyncInit()

function Facebook_login () {
          if ((parseFloat(uid) == parseInt(uid)) && !isNaN(uid)) {
                $.ajax({
                    url: '/user_actions/prep_facebook_registration',
                    cache: false,
                    type: 'POST',
                    data: { 'uid': uid, 'token': accessToken },
                    dataType: 'json',
                    success: function(data) {
                        if (data.success=='true') {
                            if ((typeof(data.redirect) != 'undefined')) {
                                if (data.redirect=='current') {
                                    location.reload();
                                } else {
                                    window.location=data.redirect;
                                }
                            }
                        }
                    }
                });
            }
      }

Это, похоже, делает для меня работу. Если у кого-то есть лучшие решения, ваш ввод будет оценен:)

Ответ 2

Фактически, есть лучшее решение.

Есть две вещи, которые вы могли бы сделать лучше:

  • В вашем методе FB.init вы устанавливаете status: true. Это сообщает странице, что он должен проверить, зарегистрирован ли пользователь на facebook сразу после загрузки страницы. В вашем случае это не только то, что вам это не нужно - это займет часть вашей пропускной способности вашего посетителя для поездки туда и обратно в facebook, что вам действительно не нужно.
  • Вам не нужно помнить переменные uid и accessToken, так как вы можете получить их по запросу с помощью метода FB.getLoginStatus.

Полное решение, основанное на вашем примере кода, будет:

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId      : 'YOUR APP ID',
      status     : false,
      cookie     : true,
      xfbml      : true
    });
  };

  (function(d){
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/en_US/all.js";
     ref.parentNode.insertBefore(js, ref);
   }(document));

   function Facebook_login () {
      FB.getLoginStatus(function(response) {
         if (response.status === 'connected') {
            var uid = response.authResponse.userID;
            var accessToken = response.authResponse.accessToken;
            if ((parseFloat(uid) == parseInt(uid)) && !isNaN(uid)) {
               $.ajax({
                   url: '/user_actions/prep_facebook_registration',
                   cache: false,
                   type: 'POST',
                   data: { 'uid': uid, 'token': accessToken },
                   dataType: 'json',
                   success: function(data) {
                      if (data.success=='true') {
                          if ((typeof(data.redirect) != 'undefined')) {
                              if (data.redirect=='current') {
                                  location.reload();
                              } else {
                                  window.location=data.redirect;
                              }
                          }
                      }
                   }
               });
            }
         }
      }
   }
</script>

<div class="fb-login-button" onlogin="Facebook_login()" autologoutlink="true" [parameters]></div>