Firebase Google Auth问题

时间:2017-11-01 16:25:34

标签: javascript firebase firebase-authentication

我正在尝试使用Google和Facebook在我的网络应用程序中创建登录,想法是通过谷歌或Facebook登录用户,检查用户的uid是否在实时数据库上并重定向用户。 / p>

checkRegisterUser: function(user){

      var register_user,
      register = false;

      app.references.user_ref.on('value', function(snapshot) {
        register_user = snapshot.val();
        console.log(register_user);
      });
      $.each(register_user, function(index, val){

        if(user.uid === index){
          register = true;
          return;
        }
      })
      console.log(register);
      if(!register){
        firebase.auth().signOut();
        $('#login').modal('hide');
        $('#modal_register').modal('show');
        return false;
      }
      $(window).attr('location', app.urlGallery());
    }


google_login: function(){

      var provider = new firebase.auth.GoogleAuthProvider();
      firebase.auth().signInWithPopup(provider).then(function(result) {
        // This gives you a Google Access Token. You can use it to access the Google API.
        var token = result.credential.accessToken;
        // The signed-in user info.
        var user = result.user;
        app.checkRegisterUser(user);
        // firebase.auth().signInWithRedirect(provider);
      }).catch(function(error) {
        console.log(error);
      });

    },

使用google或facebook登录后我发送用户对象函数checkRegisterUser()循环用户数组以查看uid是否已经在实时数据库中,如果用户uid已经在实时数据库中更改为{ {1}} true变量和重定向,我的问题是,如果用户存在,第一次给我假,只有当我第二次尝试给出时才会给出。

1 个答案:

答案 0 :(得分:1)

由于Firebase的异常特性,我在iOS上遇到了类似的问题。不是100%,但尝试一下:

逻辑 - 此功能

app.references.user_ref.on('value', function(snapshot) {
        register_user = snapshot.val();
        console.log(register_user);
});

是异步的,所以我们不知道什么时候会返回一个值。因此,在返回此调用之前,循环无法执行。但是,检查if(!register)在查询返回结果之前可能发生的情况。因此,由于寄存器的值尚未更新,因此将执行该块。

其次,遍历所有用户以检查他们是否在数据库中并不是很有效,而且肯定会很差。我建议您更改将用户存储为此类的方式,以便立即检查它们是否存在于数据库中。

users: {
    uid: {
        name: "Bart Simpson"
        email: "Bart@simpsons.com"
    }
    uid2: {
        ....
        ....
    }
}

此结构允许您使用if snapshot.exists()。这将立即告诉您用户是否在数据库中,并允许您相应地执行所需的操作。

使用上述结构,您的查询将如下所示。

var userUID = uid; 
var ref = new Firebase('https://SampleChat.firebaseIO-demo.com/users/' + userUID);
ref.on('value', function(snapshot) {
   if (snapshot.exists())
      alert ("exist");
   else
      alert ("not exist");
});

您可以阅读有关检查Firebase here中是否存在值的详情。