如何在 firebase_auth 中更新 FirebaseUser 的电话号码?

Pau*_*ger 3 firebase firebase-authentication flutter

在我的 Flutter 应用程序中,我使用 Firebase 的电话号码身份验证作为我的主要身份验证形式。身份验证后,我在我的users集合中创建一个用户,其中包含以下详细信息:

{
    phoneNumber: FirebaseAuth.instance.currentUser().phoneNumber,
    displayName: 'Comes from user textbox',
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是假设有一天用户想要更改他们的电话号码。我该怎么做呢?因为我不能简单地更改文档中用户的电话号码,因为电话号码需要进行身份验证。并且在认证之后,用户获得一个新的authUID。那么哪个应该是新用户?

有人可以解释想要保留其个人资料详细信息但更改其号码的用户背后的逻辑。

cre*_*not 8

为了实现这一点,您可以使用FirebaseUser.updatePhoneNumberCredential. 这允许您更新用户的电话号码。

您可以按照与首先使用电话号码进行身份验证的方式相同的方式使用它(使用signInWithCredential),即,您使用 检索凭证FirebaseAuth.verifyPhoneNumberverificationCompleted在他们输入收到的 SMS 代码时传递您从任一方或您的用户那里获得的凭证。我只会勾勒出这会是什么样子,因为我假设您知道如何执行此任务:

FirebaseAuth.instance.verifyPhoneNumber(
        phoneNumber: phoneNumber,
        timeout: const Duration(minutes: 2),
        verificationCompleted: (credential) async {
          await (await FirebaseAuth.instance.currentUser()).updatePhoneNumberCredential(credential);
          // either this occurs or the user needs to manually enter the SMS code
        },
        verificationFailed: null,
        codeSent: (verificationId, [forceResendingToken]) async {
          String smsCode;
          // get the SMS code from the user somehow (probably using a text field)
          final AuthCredential credential =
            PhoneAuthProvider.getCredential(verificationId: verificationId, smsCode: smsCode);
          await (await FirebaseAuth.instance.currentUser()).updatePhoneNumberCredential(credential);
        },
        codeAutoRetrievalTimeout: null);
Run Code Online (Sandbox Code Playgroud)

updatePhoneNumberCredential被调用时,您可能还想更新您的数据库文档。或者,您可以通过onAuthStateChanged这种方式收听和更新您的文档。