我正在使用 firebase 身份验证中的 verifyBeforeUpdateEmail() 函数更新当前的登录电子邮件,该函数在用户验证收件箱中收到的电子邮件链接后成功更新电子邮件(在身份验证中)。所以我的任务是一旦完成,我想用新电子邮件更新我的 firebase firestore。这怎么可能 - 因为我只想在用户成功验证后才更新 firestore。
代码片段如下:
void updateEmail(
String newEmail, BuildContext context, UserModel userData) async {
FirebaseAuth auth = FirebaseAuth.instance;
User? user = auth.currentUser;
try {
await user!.verifyBeforeUpdateEmail(newEmail);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'You will shortly receive a confirmation link if you have entered a valid email. Please open your inbox and confirm'),
),
);
}
user = auth.currentUser;
if (user!.emailVerified) {
debugPrint('Only if the current user is verified');
UserModel newUserData = userData.copyWith(
mail: newEmail,
);
newUserData.updateFirestore();
}
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('$e'),
),
);
debugPrint(e.toString());
}
}
}
但是使用上述代码,无论新的电子邮件验证如何,它都会在 firebase firestore 中更新(我不想要)。
用户电子邮件地址的实际更改发生在带外:在触发该过程的应用程序之外的另一个应用程序中,通常在用户的电子邮件应用程序中。我认为当此操作发生时,您的客户端代码不会收到任何信号,也不会触发 Cloud Function/Eventarc 供您响应。
这意味着您唯一的选择是在客户端下次获取新 ID 令牌时检测客户端中的更改,例如当您在
userChanges
流上获取事件时。发生这种情况时:检测该帐户的电子邮件地址是否与 Firestore 中的电子邮件地址不同,如果是则更新 Firestore 中的记录。
与其他带外进程类似,您可以通过 调用
reload
强制刷新 ID 令牌,您可以在应用程序重新获得焦点时(即用户从电子邮件切换回您的应用程序后)执行此操作客户端),当他们点击屏幕上的某个区域/按钮/小部件时,或定期 - 或所有这些的组合。