在 Firebase 中管理用户

创建用户

您可以通过四种方式在 Firebase 项目中创建新用户:

  • 调用 createUserWithEmailAndPassword() 方法。
  • 使用联合身份提供方(例如 Google 登录、Facebook 登录或 Apple)首次登录用户。

您还可以转至 Firebase 控制台的“身份验证”部分,在“用户”页面中创建以密码验证身份的新用户。

获取用户个人资料

要获取用户的个人资料信息,请使用 User 的属性。您可以通过以下三种方式获取代表当前用户的 User 对象:

  • authStateChangesidTokenChangesuserChanges 数据流:您的监听器将收到当前的 User;如果没有用户通过身份验证,则会收到 null

    FirebaseAuth.instance
      .authStateChanges()
      .listen((User? user) {
        if (user != null) {
          print(user.uid);
        }
      });
    

    当应用启动时,系统会在本地存储空间中的用户凭据(如有)恢复时触发一个事件,这意味着您的监听器总是在用户状态初始化时被调用。然后,每当身份验证状态发生变化时,更新后的用户状态就会触发一个新事件。

    通过监听身份验证状态,您可以构建一个界面来响应身份验证状态的这些变化。

  • 身份验证 (signIn-) 方法返回的 UserCredential 对象:UserCredential 对象 user 属性包含当前的 User

    final userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
    final user = userCredential.user;
    print(user?.uid);
    
  • FirebaseAuth 实例的 currentUser 属性:如果您确定用户当前已登录,则可以从 currentUser 属性访问 User

    if (FirebaseAuth.instance.currentUser != null) {
      print(FirebaseAuth.instance.currentUser?.uid);
    }
    

    currentUser 可能为 null,原因有两个:

    • 用户未登录。
    • auth 对象尚未完成初始化。如果您使用监听器跟踪用户的登录状态,则无需处理这种情况。

获取特定于提供方的用户个人资料信息

如需获取从用户已关联的登录服务提供方检索到的个人资料信息,可使用 providerData 属性。例如:

if (user != null) {
    for (final providerProfile in user.providerData) {
        // ID of the provider (google.com, apple.com, etc.)
        final provider = providerProfile.providerId;

        // UID specific to the provider
        final uid = providerProfile.uid;

        // Name, email address, and profile photo URL
        final name = providerProfile.displayName;
        final emailAddress = providerProfile.email;
        final profilePhoto = providerProfile.photoURL;
    }
}

更新用户个人资料

您可以使用 update- 方法来更新用户的基本个人资料信息(即用户的显示名称和个人资料照片网址)。例如:

await user?.updateDisplayName("Jane Q. User");
await user?.updatePhotoURL("https://example.com/jane-q-user/profile.jpg");

设置用户电子邮件地址

您可以使用 updateEmail() 方法设置用户的电子邮件地址。例如:

await user?.updateEmail("janeq@example.com");

向用户发送验证电子邮件

您可以使用 sendEmailVerification() 方法向用户发送地址验证电子邮件。例如:

await user?.sendEmailVerification();

您可以在 Firebase 控制台的“Authentication”部分的“电子邮件模板”页面中自定义使用的电子邮件模板。请参阅 Firebase 帮助中心内的电子邮件模板

在发送验证电子邮件时,还可以通过一个接续网址传递状态以重定向回应用。

此外,在发送验证电子邮件之前,您可以通过更新 Auth 实例中的语言代码来对该电子邮件进行本地化。例如:

await FirebaseAuth.instance.setLanguageCode("fr");
await user?.sendEmailVerification();

设置用户密码

您可以使用 updatePassword() 方法设置用户密码。例如:

await user?.updatePassword(newPassword);

发送重设密码电子邮件

您可以使用 sendPasswordResetEmail() 方法向用户发送重设密码电子邮件。例如:

await FirebaseAuth.instance
    .sendPasswordResetEmail(email: "user@example.com");

您可以在 Firebase 控制台的“Authentication”部分的“电子邮件模板”页面中自定义使用的电子邮件模板。请参阅 Firebase 帮助中心内的电子邮件模板

在发送重设密码电子邮件时,还可以通过一个接续网址传递状态以重定向回应用。

此外,在发送重设密码电子邮件之前,您可以通过更新 Auth 实例中的语言代码来对该电子邮件进行本地化。例如:

await FirebaseAuth.instance.setLanguageCode("fr");

您也可以从 Firebase 控制台发送重设密码电子邮件。

删除用户

您可以使用 delete() 方法删除用户帐号。例如:

await user?.delete();

您还可以转至 Firebase 控制台的“Authentication”部分,在“用户”页面中删除用户。

重新对用户进行身份验证

某些涉及安全的敏感操作(例如删除帐号设置主电子邮件地址更改密码)只能针对最近登录过的用户执行。如果您执行这类操作,而用户上次登录的时间距离现在已过去太久,则操作将失败并抛出代码为 requires-recent-loginFirebaseAuthException。发生这种情况时,请向用户索取新的登录凭据并将这些凭据传递给 reauthenticate,以便对该用户重新进行身份验证。例如:

// Prompt the user to re-provide their sign-in credentials.
// Then, use the credentials to reauthenticate:
await user?.reauthenticateWithCredential(credential);

导入用户帐号

您可以使用 Firebase CLI 的 auth:import 命令,将用户帐号从文件导入 Firebase 项目中。例如:

firebase auth:import users.json --hash-algo=scrypt --rounds=8 --mem-cost=14