Firebase Google Auth issue



我正试图在我的网络应用程序中创建一个使用谷歌和脸书的登录,想法是使用谷歌或脸书登录用户,检查用户的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);
});
},

在用谷歌或脸书登录后,我向用户对象发送函数checkRegisterUser()循环用户数组,看看uid是否已经在实时数据库上,如果用户uid已经在实时数据库上,则将register变量更改为true并重定向,我的问题是,如果用户存在,第一次总是给我false,只有当我尝试第二次时才给true。

由于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中是否存在值的更多信息。

最新更新