我目前正在开发一个Flutter应用,要求用户在使用前进行注册。我使用Firebase身份验证,并想检查电子邮件是否已在应用程序中注册。
我知道简单的方法是在使用java.sql.DriverManager.getConnection("jdbc:sqlite:" + dbLoc)
方法时捕获异常(如this question所述)。问题是我要求使用与注册用户不同的路径发送电子邮件地址,因此对我而言,等待直到调用此方法为止不是一个好选择。
我认为最好的选择是使用方法createUserWithEmailAndPassword()
,但是我似乎无法使它起作用。
如何使用该方法?还是有更好的选择来知道电子邮件是否已经注册?
答案 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报告以下错误代码-
答案 3 :(得分:0)
firebase auth 包的当前版本中不再有这样的 fetchProvidersForEmail
方法。现在等效的方法是 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;
}
}