Html 如何确定电子邮件是否已通过Firebase Simple Login注册?

Html 如何确定电子邮件是否已通过Firebase Simple Login注册?,html,firebase,angularfire,firebase-security,Html,Firebase,Angularfire,Firebase Security,我正在使用firebase(与Angularfire一起)开发html5手机应用程序。用户在开始屏幕中只输入他们的电子邮件,然后,根据该电子邮件是否已注册,用户将分别重定向到登录或注册页面。对于步骤1,我们如何查询firebase简单登录以确定电子邮件是否已注册?2018年7月19日更新 前面提到的方法已被弃用。现在使用 2016年6月26日更新 自最初发布以来,发生了很多变化,Firebase身份验证不再称为Firebase简单登录 此外,似乎有一种新方法可用fetchProvidersFor

我正在使用firebase(与Angularfire一起)开发html5手机应用程序。用户在开始屏幕中只输入他们的电子邮件,然后,根据该电子邮件是否已注册,用户将分别重定向到登录或注册页面。对于步骤1,我们如何查询firebase简单登录以确定电子邮件是否已注册?

2018年7月19日更新

前面提到的方法已被弃用。现在使用

2016年6月26日更新

自最初发布以来,发生了很多变化,Firebase身份验证不再称为Firebase简单登录

此外,似乎有一种新方法可用
fetchProvidersForEmail
,它可能会提供此问题的解决方案

从:

fetchProvidersForEmail(电子邮件)返回包含非空字符串数组的firebase.Promise

获取可用于登录给定电子邮件地址的提供程序ID的列表。对于“标识符优先”登录流非常有用

我还没有对此进行测试,但我可以想象,如果您调用该方法并接收一组提供者,那么电子邮件必须已经向一个或多个身份验证提供者注册

旧答案

我不相信您可以直接查询Firebase Simple Login以获取该信息,而不尝试实际登录用户或注册用户

您需要做的是在注册过程中存储已注册电子邮件的列表,然后查询该列表。然后您可以查询该路径,如果它返回数据,它就存在,否则它就不存在。

按照加藤和米克普的评论建议,我将编写此解决方案,它对我有效

解决方案1(强烈推荐)

mAuth.fetchProvidersForEmail(“emailaddress@gmail.comaddOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
/////////getProviders().size()将返回大小1。如果电子邮件ID可用。
task.getResult().getProviders().size();
}
}
});
解决方案#2

创建虚拟的FirebaseUser对象

FirebaseUser firebaseUser = null;
private FirebaseAuth mAuth;

private void isEmailAlreadyUsed() {
    mAuth = FirebaseAuth.getInstance();

///// here I am gonna create dummy user at **Firebase** with the Entered email Id (Email to check against) 

    mAuth.createUserWithEmailAndPassword(mEmailView.getText().toString(), "dummypass")
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "createUser:onComplete:" + task.isSuccessful());


                    if (task.isSuccessful()) {
                        /////user do not exit so good to initialize firebase user.              
                    firebaseUser = task.getResult().getUser();
                    } else {
                        if(task.getException().getMessage().equals("The email address is already in use by another account.")) {
                          Log.d(TAG, "This email ID already used by someone else");     
                        }
                    }
                }
            });
}
FirebaseUser FirebaseUser=null;
私人消防队;
私有无效IsemailReadyUsed(){
mAuth=FirebaseAuth.getInstance();
/////在这里,我将使用输入的电子邮件Id(要检查的电子邮件)在**Firebase**创建虚拟用户
mAuth.createUserWithEmailAndPassword(mEmailView.getText().toString(),“dummypass”)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
d(标记“createUser:onComplete:+task.issusful()”);
if(task.issusccessful()){
/////用户无法很好地退出以初始化firebase用户。
firebaseUser=task.getResult().getUser();
}否则{
if(task.getException().getMessage().equals)(“该电子邮件地址已被其他帐户使用。”){
Log.d(标记“此电子邮件ID已被其他人使用”);
}
}
}
});
}
稍后,当用户输入密码并按“注册”按钮时,您只需更新设置为“dummypass”的用户密码即可

   boolean isSignUpMade = false;
    if (firebaseUser != null)
        firebaseUser.updatePassword(password)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        signUpCallProgress.setVisibility(View.VISIBLE);
                        if (task.isSuccessful()) {
                            isSignUpMade = true;
                            Log.d(TAG, "User password updated.");
                        } else {
                            isSignUpMade = false;
                            Log.d(TAG, "User password not updated.");
                        }
                    }
                });
boolean isSignUpMade=false;
if(firebaseUser!=null)
firebaseUser.updatePassword(密码)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
signUpCallProgress.setVisibility(View.VISIBLE);
if(task.issusccessful()){
issignupmake=true;
Log.d(标记“用户密码已更新”);
}否则{
Issignupmake=假;
Log.d(标记“用户密码未更新”);
}
}
});
您可以看到,我使用了isSingUpMade变量只是为了确保用户按下SINGUP按钮

如果用户不想注册就离开,则必须从FIREBASE服务器中删除该虚拟用户

这就是逻辑

 @Override
public void onBackPressed() {
    if (!isSignUpMade) {
        if (firebaseUser != null)
            firebaseUser.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "User account deleted.");
                    }
                }
            });
    }
    super.onBackPressed();
}
@覆盖
public void onBackPressed(){
如果(!issignupmake){
if(firebaseUser!=null)
firebaseUser.delete().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Log.d(标记“用户帐户已删除”);
}
}
});
}
super.onBackPressed();
}

您可以在registerActivity中的register()方法之前添加以下代码

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if(email.equals(user.getEmail().trim())) {
    Toast.makeText(this, "Email is taken", Toast.LENGTH_SHORT).show();
    return;
}

这是一个更简单的示例,用于了解如何在使用电子邮件/密码注册时捕获用户是否已存在

  • 抓住错误
  • 如果存在“身份验证/电子邮件已在使用”
  • 调用另一个包含
    .signiWithEmailandPassword()的函数。
  • 示例

        .createUserWithEmailAndPassword(email, password)
    
        .catch(error => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
    
          // Catch this errorCode to know if user exists
          if (errorCode === 'auth/email-already-in-use') {
            // Call function X to sign user in instead
            signInMail(email, password);
            return;
          } 
    
          // Weak password?
          else if (errorCode == 'auth/weak-password') {
            console.log('The password is too weak.');
          } 
    
         else {
            console.log(errorMessage);
          }
          console.log(error);
        })
    
    您希望在自己的代码中使用的重要部分是

    .catch(error => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
          if (errorCode === 'auth/email-already-in-use') {
            console.log('This email is already in use');
            // Your action
            return;
          }
        })
    

    这是最好的选择,但不是唯一的选择。例如,您可以尝试创建用户,看看是否成功;如果失败,它会告诉你它已经存在于错误中。@Kato-在某些情况下,它会变得复杂。例如,如果用户启动了注册过程,但是
    .catch(error => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
          if (errorCode === 'auth/email-already-in-use') {
            console.log('This email is already in use');
            // Your action
            return;
          }
        })