我使用的是Firebase Web SDK v4.0.0,我试图确保只有唯一的用户名(用户选择的字符串)存储在数据库中。我已经设置了电子邮件/密码验证,工作正常。我还设置了规则以确保用户名是唯一的。数据库写入依赖于从创建用户时传递的身份验证。但是,当在写入数据库阶段发生冲突时(即所选用户名不是唯一的),用户已经被创建。
感觉正确的事情是包含用户创建/身份验证和数据库写入的事务,但我无法在文档中找到任何相关信息。有没有人以前处理过这种情况?
这是我的规则文件:
{
"rules": {
"users": {
"$userID": {
"username": {
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString()"
}
}
},
"usernames": {
"$username": {
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString() && newData.val() == root.child('users/' + auth.uid + '/username').val()"
}
}
}
}
以及我注册码的相关位:
var ref = firebase.database().ref();
var userData = {};
userData["usernames/" + username] = firebase.auth().currentUser.uid;
userData["users/" + firebase.auth().currentUser.uid] = {
username: username,
signupdate: firebase.database.ServerValue.TIMESTAMP,
uid: firebase.auth().currentUser.uid, // store it here for easy comparison later
displayname: displayname,
email: email
};
// Do a deep-path update
ref.update(userData, function(error) {
if (error) {
console.log("Error updating data:");
console.log(error);
}
});
BTW我在提交表单之前进行客户端检查,以防止在我的Web表单中提交重复的用户名。这种服务器端方法是尝试阻止使用控制台的恶意用户绕过我的检查并提交“无用的”#39;重复。