在 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 文件

在 Flutter Web App 中使用 Firebase 实时数据库

Flutter Firebase 错误(任务 ':app:mergeExtDexDebug' 执行失败)