gpt4 book ai didi

angularjs - 如何防止 Firebase 中出现重复的用户属性?

转载 作者:行者123 更新时间:2023-12-03 09:25:48 31 4
gpt4 key购买 nike

我正在使用 FirebaseSimpleLogin创建用户并处理身份验证。

当我尝试通过 $createUser() 创建一个简单登录的新用户时方法,如果电子邮件地址已被使用,firebase 将不会创建用户。但是,我也在使用 $set()在创建用户并使用 user.uid 后将其保存到我的 firebase作为关键。尝试写入数据库时​​,即使用户名不是唯一的,firebase 也会保存记录,因为简单登录只需要电子邮件和密码。那么,当用户名不被用作用户对象的键时,如何验证用户名是唯一的呢?

我正在创建这样的新用户:

$scope.createUser = function() {
$scope.auth.$createUser('trinker@gmail.com', 'password').then(function(user, err) {
if (!err) {
ref.child('users/' + user.uid).set({
email: user.email,
username: user.username
});
console.log("success!");
}else{
console.log(err.message);
}
});
}

我的用户对象如下所示:
{
"users" : {
"simplelogin:28" : {
"email" : "trinker@gmail.com",
"username" : "jtrinker"
},
"simplelogin:30" : {
"email" : "test@gmail.com",
"username" : "jtrinker"
}
}
}

}

我需要使用 uid 作为每个用户的键,但我仍然需要用户名是唯一的。

如果一个对象中的属性不是另一个对象中的属性所独有的,我该如何防止 firebase 保存记录?

最佳答案

首先,如果用户已经拥有 username ,它是独一无二的,并且不会消失,我建议您放弃使用简单登录 uid s。正如您在这里已经发现的那样,这只会产生试图在两者之间来回切换的问题。调查creating your own tokens使用像 firebase-passport-login 这样的工具然后通过 username 存储记录.

但既然这不是你的问题,让我们在我们在这里的时候解决这个问题,因为你可能想继续前进,进入我多次经过的双重身份的荆棘荆棘。

要使用户名唯一,请存储用户名索引。

/users/$userid/username/$username
/usernames/$username/$userid

为确保它们是唯一的,请在 usernames/路径中的用户 ID 上添加如下安全规则,以确保每个用户名只能分配一个用户,并且该值是用户的 ID:
".write": "newData.val() === auth.uid && !data.exists()"

现在通过将以下内容添加到 users/记录中的用户名来强制它们匹配:
"users": {
"$userid": {
"username": {
".validate": "root.child('usernames/'+newData.val()).val() === $userid"
}
}
}

这将确保 id 是唯一的。小心读取权限。您可能希望完全避免这些,因为您不希望任何人查找私有(private)电子邮件或用户名。 Something like I demonstrated in support保存这些将是理想的。

这里的想法是您尝试分配用户名和电子邮件,如果它们失败,那么它们已经存在并且属于另一个用户。否则,您将它们插入到用户记录中,现在让用户按 uid 和电子邮件进行索引。

为了遵守 SO 协议(protocol),以下是该要点的代码,最好通过链接阅读:
var fb = new Firebase(URL);

function escapeEmail(email) {
return email.replace('.', ',');
}

function claimEmail(userId, email, next) {
fb.child('email_lookup').child(escapeEmail(email)).set(userId, function(err) {
if( err ) { throw new Error('email already taken'); }
next();
});
}

function claimUsername(userId, username, next) {
fb.child('username_lookup').child(username).set(userId, function(err) {
if( err ) { throw new Error('username already taken'); }
next();
});
}

function createUser(userId, data) {
claimEmail(userId, data.email, claimUsername.bind(null, userId, data.username, function() {
fb.child('users').child(userId).set(data);
);
}

和规则:
{
"rules": {
"users": {
"$user": {
"username": {
".validate": "root.child('username_lookup/'+newData.val()).val() === auth.uid"
},
"email": {
".validate": "root.child('email_lookup').child(newData.val().replace('.', ',')).val() === auth.uid"
}
}
},

"email_lookup": {
"$email": {
// not readable, cannot get a list of emails!
// can only write if this email is not already in the db
".write": "!data.exists()",
// can only write my own uid into this index
".validate": "newData.val() === auth.uid"
}
},
"username_lookup": {
"$username": {
// not readable, cannot get a list of usernames!
// can only write if this username is not already in the db
".write": "!data.exists()",

// can only write my own uid into this index
".validate": "newData.val() === auth.uid"
}
},
}
}

关于angularjs - 如何防止 Firebase 中出现重复的用户属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25294478/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com