创建用户
您可以通过四种方式在 Firebase 项目中创建新用户:
- 调用
createUserWithEmailAndPassword()
方法。 - 使用联合身份提供方(例如 Google 登录、Facebook 登录或 Apple)首次登录用户。
您还可以转至 Firebase 控制台的“Authentication”部分,在“用户”页面中创建以密码验证身份的新用户。
获取用户个人资料
要获取用户的个人资料信息,请使用 User
的属性。您可以通过以下三种方式获取代表当前用户的 User
对象:
authStateChanges
、idTokenChanges
和userChanges
数据流:您的监听器将收到当前的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-login
的 FirebaseAuthException
。发生这种情况时,请向用户索取新的登录凭据并将这些凭据传递给 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