【问题标题】:Create user with Auth and write to Firestore at the same time使用 Auth 创建用户并同时写入 Firestore
【发布时间】:2018-03-04 21:32:46
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 你知道会话是如何工作的吗?您首先验证用户,然后执行所有操作,直到用户注销。验证后只需插入数据即可。
  • 此时我没有进行身份验证,我正在创建全新用户
  • 好的。所以创建用户,然后进行身份验证,然后插入数据
  • 当你创建一个用户的同时,他正在被认证。接下来我创建数据。这就是我正在做的事情。这里的问题是,如果他被创建/验证并且数据创建失败。我不想经历删除用户的过程。这就是为什么我希望有一种方法可以在一次调用中完成“批处理”工作
  • 啊。我认为您正在寻找的是云功能。参考this

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


【解决方案1】:

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

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

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

编辑:

既然你说你正在使用 Firebase 身份验证,你也可以使用一个用 Cloud Function 编写的函数来达到你的目标。您可以编写一个函数,该函数将在项目中每次发生某些事情时运行。其中一个“东西”就是creation of an user。换句话说,您可以在每次创建新用户时执行您的逻辑。这是一个例子:

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

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

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

【讨论】:

  • 您好,Alex,谢谢您,但这并不能回答问题。就像我在问题中所说的那样,我正在寻找像您一样链接它们的替代方法。如果添加到 firestore 有效,您的解决方案是有效的。我担心的是,如果 auth 操作成功但添加到 firestore 失败怎么办?这就是问题所在,因为我需要回滚整个操作。所以我希望批量解决方案要么成功要么出错
  • 没有办法批量解决。这是因为有 2 个单独的操作。因此,为了能够在数据库中写入用户详细信息,您需要首先成功通过身份验证。如果您想要回滚,那么当您将用户详细信息写入数据库时​​,您需要再次使用addOnCompleteListener。如果你得到一个错误,只是把用户弄坏了。如您所述,没有可以处理身份验证和数据库写入操作的事务/批处理操作。
  • 谢谢。好吧,如果你把它作为答案,那么我会接受它
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我已经通过使用云功能来创建身份验证用户和 Firestore 文档解决了这个问题。通过这种方式,您可以轻松获得创建用户所需的一些额外数据,例如邀请码或类似的东西。

    export const signUp = functions.https.onCall(async (data, context) => {
        const email = data.email;
        const password = data.password;
        const firstName = data.firstName;
        const lastName = data.lastName;
        const inviteCode = data.inviteCode;
    
        const userRecord = await admin.auth().createUser({
            email: email,
            displayName: (firstName && lastName) ? (firstName + ' ' + lastName) : (firstName ?? lastName),
            password: password
        });
    
        await admin.firestore().collection(constants.COLL_USERS).doc(userRecord.uid).set({
            inviteCode: inviteCode
        })
    });
    

    【讨论】:

    • 此解决方案不起作用。这些承诺不是原子的。 admin.auth().createUser 调用可能有效,而 Firestore 中的写入无效,导致创建的用户没有在 Firestore 中写入任何文档。
    【解决方案4】:

    如果你想同时进行身份验证,还想在FireStore中保存其他详细信息,那么你也可以这样做。

    如果让 email = emailTextfield.text,让密码 = passwordTextfield.text,让发件人名 = 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)
                }
    
            }
        }
    

    【讨论】:

    • 如果应用程序崩溃,或者在过程中断开连接怎么办?
    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 2021-10-18
    • 2021-08-04
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多