检查Flutter App的Firebase Auth中是否已经存在电子邮件

时间:2018-08-02 11:08:14

标签: firebase firebase-authentication flutter

我目前正在开发一个Flutter应用,要求用户在使用前进行注册。我使用Firebase身份验证,并想检查电子邮件是否已在应用程序中注册。

我知道简单的方法是在使用java.sql.DriverManager.getConnection("jdbc:sqlite:" + dbLoc)方法时捕获异常(如this question所述)。问题是我要求使用与注册用户不同的路径发送电子邮件地址,因此对我而言,等待直到调用此方法为止不是一个好选择。

我认为最好的选择是使用方法createUserWithEmailAndPassword(),但是我似乎无法使它起作用。

如何使用该方法?还是有更好的选择来知道电子邮件是否已经注册?

4 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。正如 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;
     }
   }
 }

如果您有任何建议,请留下评论。

答案 1 :(得分:1)

我认为应用程序内唯一的可能性是尝试使用该电子邮件登录(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,您可以尽快提醒用户。

您可以使用当前版本的插件中的错误代码进行这些检查。

答案 2 :(得分:0)

引发的错误是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-如果该电子邮件已被其他帐户使用。

答案 3 :(得分:0)

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;
  }
}