使用Auth创建用户并同时写入Firestore

时间:2018-03-04 21:32:46

标签: java android firebase firebase-authentication google-cloud-firestore

我有一个场景,我需要使用Auth创建用户,并向Firestore数据库添加更多信息(例如名称和业务类型)。 Firestore作为事务/批处理操作,但仅适用于Firestore。

有没有办法可以执行Auth操作,例如与Firestore数据插入一起创建。两种操作都必须成功或失败。现在我链接他们,但我担心一个人失败,另一个成功需要优雅地处理。

谢谢

3 个答案:

答案 0 :(得分:2)

在实施Firebase身份验证时,您可以使用addOnCompleteListeneraddOnSuccessListener并实施isComplete()isSuccessful()方法。在其中一种方法中,您需要在Firestore数据库中创建用户。换句话说,只有在身份验证成功的情况下才会创建用户。因此,如果isSuccessful()其中一个方法下的所有操作都成功,或者没有应用任何操作。

这两种方法之间的区别在于,当完成该任务所代表的工作时,无论其成功与否,我们都可以complete。可能存在或可能没有错误,但我们需要检查错误。当任务所代表的工作按预期完成时,任务为successful,没有错误。

总之,没有办法获得批量解决方案。这是因为有2个单独的操作。因此,为了能够在数据库中编写用户详细信息,您需要首先成功通过身份验证。如果要进行回滚,则在将用户详细信息写入数据库时​​需要再次使用addOnCompleteListener。如果你得到一个错误只是罪恶的用户。没有事务/批处理操作可以处理您所描述的身份验证和数据库写操作。

修改

由于您说您正在使用Firebase身份验证,因此您还可以使用以云功能编写的功能来实现目标。您可以编写一个函数,该函数将在项目中的某些内容发生时运行。其中一个“事物”是creation of an user。换句话说,您可以在每次创建新用户时执行逻辑。这是一个例子:

exports.updateUserCount = functions.auth.user().onCreate((user) => {
  //Do what you need to do
});

此外,您可以在删除用户时执行相同操作,但使用onDelete()方法注册函数。

这将非常快,因为没有与用户设备的交互。请参阅有关Firebase Cloud Functions的更多信息。

答案 1 :(得分:2)

执行此类方案的最佳方法是使用Firebase Cloud Functions。云功能在各种创建/更新/删除/写入操作上触发。您可以在创建新用户时触发云功能,然后在其中进行相关的Auth创建。

https://firebase.google.com/docs/firestore/extend-with-functions

因此,在这种情况下,您首先创建用户数据,然后成功创建该数据,称为Firebase Auth用户创建。如果您担心失败的情况,则可以删除创建的用户,以防身份验证创建失败。

答案 2 :(得分:-1)

如果您想同时进行身份验证,并且还希望将其他详细信息保存在FireStore中,那么您也可以采用这种方式。

如果让email = emailTextfield.text,让密码= passwordTextfield.text,让sendername = nameTextField.text {

        Auth.auth().createUser(withEmail: email, password: password) { authResult, error in

            if let e = error {
                self.showAlert(e.localizedDescription)
            }
            else{

                self.db.collection(K.FStore.registeredDetails).addDocument(data: [K.FStore.registeredName : sendername,
                                                                                  K.FStore.registeredEmail : self.emailTextfield.text!
                ])

                self.performSegue(withIdentifier: K.registerSegue, sender: self)
            }

        }
    }