首页 文章

Firebase Google Auth问题

提问于
浏览
0

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

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已经在实时数据库中更改为 true register 变量并重定向,我的问题是,如果用户存在,第一次给我假,只有当我第二次尝试给予真实时 .

1 回答

  • 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中是否存在值的详细信息 .

相关问题