在 Flutter App 的 Firebase Auth 中检查电子邮件是不是已存在
Posted
技术标签:
【中文标题】在 Flutter App 的 Firebase Auth 中检查电子邮件是不是已存在【英文标题】:Check if an email already exists in Firebase Auth in Flutter App在 Flutter App 的 Firebase Auth 中检查电子邮件是否已存在 【发布时间】:2019-01-10 03:18:11 【问题描述】:我目前正在开发一款 Flutter 应用,该应用需要用户在使用前进行注册。我使用 Firebase 身份验证并想检查电子邮件是否已在应用中注册。
我知道最简单的方法是在使用createUserWithEmailAndPassword()
方法时捕获异常(如this question 中的回答)。问题是我在与用户注册的路径不同的路径中请求电子邮件地址,因此等到调用此方法对我来说不是一个好选择。
我认为最好的选择是使用方法fetchProvidersForEmail()
,但我似乎无法使其工作。
如何使用该方法?或者是否有更好的选择来了解电子邮件是否已注册?
【问题讨论】:
【参考方案1】:引发的错误是PlatformException 因此您可以执行以下操作-
try
_firbaseAuth.createUserWithEmailAndPassword(
email: 'foo@bar.com',
password: 'password'
);
catch(signUpError)
if(signUpError is PlatformException)
if(signUpError.code == 'ERROR_EMAIL_ALREADY_IN_USE')
/// `foo@bar.com` has alread been registered.
Firebase Auth 报告以下错误代码 -
ERROR_WEAK_PASSWORD - 如果密码不够强。 ERROR_INVALID_EMAIL - 如果电子邮件地址格式错误。 ERROR_EMAIL_ALREADY_IN_USE - 如果电子邮件已被其他帐户使用。【讨论】:
您能告诉我如何处理 Facebook/google 登录吗?就像用户正在尝试登录 Facebook,那么如何验证该特定用户是新用户还是旧用户?谢谢【参考方案2】:我认为应用程序内唯一的可能性是尝试使用该电子邮件登录 (signInWithEmailAndPassword
) 并检查结果。
如果密码无效,则该帐户存在。 如果是无效账号,则该账号不存在。
Error 17011
There is no user record corresponding to this identifier. The user may have been deleted
Error 17009
The password is invalid or the user does not have a password
由于这是一种丑陋的解决方案,您可以使用它来证明这个额外的调用是合理的,以检查它的电子邮件格式是否正确(根据 firebase 规则)。如果不符合,它会抛出address is badly formatted
,您可以尽快提醒用户。
您可以使用当前版本的插件的错误代码进行这些检查。
【讨论】:
我猜这样就行了。如果我之前提到的方法有效,那将是最好的,但同时这也大致相同。谢谢。【参考方案3】:firebase auth 包的当前版本中不再有这样的fetchProvidersForEmail
方法。现在等效的是fetchSignInMethodsForEmail
方法,我认为这是处理这种情况而不执行任何不必要的操作的最佳选择。
fetchSignInMethodsForEmail
在文档中,说明此方法在未找到用户时返回一个空列表,这意味着没有帐户拥有指定的电子邮件地址:
返回可用于登录给定的登录方法列表 用户(由其主要电子邮件地址标识)。
当您支持多重身份验证时,此方法很有用 如果您想实现电子邮件优先身份验证的机制 流。
如果找不到用户,则返回一个空列表。
基于此,我们可以创建自己的方法,如下所示:
// Returns true if email address is in use.
Future<bool> checkIfEmailInUse(String emailAddress) async
try
// Fetch sign-in methods for the email address
final list = await FirebaseAuth.instance.fetchSignInMethodsForEmail(emailAddress);
// In case list is not empty
if (list.isNotEmpty)
// Return true because there is an existing
// user using the email address
return true;
else
// Return false because email adress is not in use
return false;
catch (error)
// Handle error
// ...
return true;
【讨论】:
【参考方案4】:有很多方法可以做到这一点。正如 Sakchham 提到的,您可以使用该方法。您可以使用另一种方法,我认为它更好更安全。
由于password
的值会返回ERROR_WEAK_PASSWORD
,这是一个你正在调用的创建帐户方法,这意味着如果帐户不存在,可能会创建一个帐户,在这种情况下,我个人建议使用邮箱登录方式。
我在下面使用了这段代码:
Future<dynamic> signIn(String email) async
try
auth = FirebaseAuth.instance;
await auth.signInWithEmailAndPassword(email: email, password: 'password');
await auth.currentUser.reload();
return true;
on FirebaseAuthException catch (e)
switch (e.code)
case "invalid-email":
return 'Your username or password is incorrect. Please try again.';
break;
如果您有任何建议,请留下评论。
【讨论】:
【参考方案5】:我认为 fetchProvidersForEmail() 方法在 firebase 包中不可用。所以我们可以向用户显示适当的消息。如果需要,您可以创建更多案例。
try
await _auth.signInWithEmailAndPassword(
email: "Hello@worl.com",
password: "123456789"
);
catch (e)
print(e.code.toString());
switch (e.code)
case "email-already-in-use":
showSnackBar(context,"This Email ID already Associated with Another Account.");
break;
【讨论】:
以上是关于在 Flutter App 的 Firebase Auth 中检查电子邮件是不是已存在的主要内容,如果未能解决你的问题,请参考以下文章
Flutter, FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 调用 Firebase App.ini
如何在第二个 Firebase 主机中部署 Flutter Web App?
Flutter Web - Firebase:没有创建 Firebase App '[DEFAULT]' - 调用 Firebase App.initializeApp() (app/no-app)
在 Flutter App 中从 Firebase 存储加载 PDF 文件