我已经合并了五个视图控制器的注册流程,而不是一个用于Firebase注册的中央VC。
通常在注册之前会出现数据丢失的问题,但我会通过编程方式将所有输入的值推送到最终确认页面并最终将数据发送到Firebase以进行身份验证。
我的问题在于 - 我想在注册之前检查用户名是否存在。这对我的应用程序的用户体验来说是必不可少的,我不能只为这一个VC做这个。
这是我对UsernameViewController的代码:
let rootRef = FIRDatabase.database().reference()
rootRef.queryOrdered(byChild: "users").queryEqual(toValue: self.chooseUsernameTextField.text!)
.observe(FIRDataEventType.value, with: { (snapshot: FIRDataSnapshot!) in
if snapshot.hasChildren() == false {
print("not found")
} else {
print("usr found")
}
});
以下是我对Firebase数据库安全规则的代码
{
"rules": {
".read": false,
".write": false,
"users": {
".validate": "data.child('username').val() === true",
".read": true
}
}
}
最后,我的数据树的截图(我的数据树不会让我嵌套任何新用户或创建没有值的用户节点出于某种原因):
Picture of Firebase Data Tree: App Name/Users
我怀疑我的数据规则和树是否配置正确以匹配代码,但我陷入了一个XY问题,即不知道如何处理Firebase安全性以使我的用户名检查代码完整
请帮帮我! :(
答案 0 :(得分:1)
我没有测试过代码,但理论上是按用户名排序,等于你要查找的用户名。如果存在此快照,则您已在数据库中拥有一个具有该名称的用户(如果您不这样做)。
当我有机会更新我的帖子时,会运行并测试代码。
let rootRef = FIRDatabase.database().reference()
rootRef.child("users").queryOrdered(byChild:"username").queryEqual(toValue: self.chooseUsernameTextField.text!)
.observe(.value, with: { (snapshot) in
if snapshot.exists() == false {
print("not found")
} else {
print("usr found")
}
});
答案 1 :(得分:1)
如果在Firebase的Auth部分中创建了用户,那么您实际上可以使用fetchProviders方法,如果没有返回提供程序,则您在Auth部分中没有用户。
FIRAuth.auth()?.fetchProviders(forEmail: email, completion: { (providers, error) in
if providers == nil {
// user doesn't exist
} else {
// user does exist
}
})
答案 2 :(得分:0)
使用Firestore保存用户时,我这样做
Auth.auth().addStateDidChangeListener({ (auth, user) in
if let id = user?.uid{
let userDoc = db.collection("users").document(id)
userDoc.getDocument { (document, error) in
if document == nil{// if user doesn't exist, create one
self.db.collection("users").document(id).setData(userProfile.toDictionary()){ error in
}
}
}
}
})