防止重复用户在 Firestore IOS 中



我通过Firebase有三种不同的登录选项:电子邮件,Facebook,谷歌。我正在使用 Firestore 来存储用户信息,并且不希望有重复的用户。当用户"注册"新帐户时,我想检查该 uid 是否尚未使用。这就是我所拥有的,但它仍然不起作用(您可以拥有具有相同帐户和 uid 的重复用户以及所有内容):

func addUserToFirestore(_ firstName:String, _ lastName:String, _ uid:String, _ email:String) {
let db = Firestore.firestore()
let docRef = db.collection("users").document("uid")
// check if user exists in firestore
docRef.getDocument { (document, error) in
if let document = document {
if document.exists {
// user exists. send to chats screen.
print("User already exists. Document data: (String(describing: document.data()))")
self.transitionToConvo()
} else {
// user does not exits. create a new user
print("Document does not exist. Create new user.")
db.collection("users").addDocument(data: ["firstname":firstName, "lastname":lastName, "uid":uid, "email":email ]) { (error) in
print("New user created in Firestore")
self.transitionToConvo()

if error != nil {
// Show error message
print("Error saving user data to Firestore")
}
}
}
}
}
}

它在这里被调用(Facebook,谷歌和电子邮件略有不同)。这是针对Facebook注册/登录的:

Auth.auth().signIn(with: credential, completion: { (user, error) in
let firstName = user?.user.displayName
let email = user?.user.email
let lastName = ""
guard let uid = user?.user.uid else { return }

if let err = error {
print("Failed to create a Firebase User with Google account: ", err)
return
} else {
// Successfully logged in
print("Successfully logged into Firebase with Google uid: ", uid, "Now add user to Firestore if user is new.")

// check if user already exists
**self.addUserToFirestore(firstName ?? "", lastName, uid, email ?? "")**
}
})
}

如您所见,两个用户的 uid 是相同的: 用户 1 用户 2 如何让它没有重复的用户?任何帮助将不胜感激!

这里有几个问题。

获取用户文档

您正在调用正在获取 ID 为"uid"的文档let docRef = db.collection("users").document("uid")。 您需要传入用户的 ID。

let db = Firestore.firestore()
let docRef = db.collection("users").document(uid)

创建新文档

您正在使用addDocument因此Cloud Firestore会创建一个自动生成的ID,该ID与您的用户ID无关。 有关详细信息,请查看 https://firebase.google.com/docs/firestore/manage-data/add-data#set_a_document。

docRef.setData(data: [
"firstname":firstName,
"lastname":lastName,
"uid":uid,
"email":email
])

最新更新