如何查看电子邮件是否已在Firebase简单登录中注册?

时间:2014-02-27 19:33:13

标签: html5 firebase angularfire firebase-security

我正在使用firebase(使用Angularfire)来获取html5手机应用。用户仅在开始屏幕中输入他们的电子邮件,然后,根据该电子邮件是否已经注册,用户将分别重定向到登录页面或注册页面。对于step1,我们如何查询firebase简单登录以确定电子邮件是否已注册?

3 个答案:

答案 0 :(得分:22)

更新7/19/2018

以前提及的方法已弃用。现在使用了fetchSignInMethodsForEmail

2016年6月26日更新

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

此外,它看起来像是一种可用的新方法fetchProvidersForEmail,可能会解决此问题。

来自docs

  

fetchProvidersForEmail(email)返回包含非null数组字符串的firebase.Promise

     

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

我没有对此进行过测试,但我想如果您调用该方法并接收一组提供程序,则必须已经向一个或多个身份验证提供程序注册了电子邮件。

旧答案

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

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

答案 1 :(得分:14)

关注#Kato和#MikePugh的评论建议我将编写此解决方案,它对我有用。

解决方案#1(强烈推荐)

 mAuth.fetchProvidersForEmail("emailaddress@gmail.com").addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>() {
        @Override
        public void onComplete(@NonNull Task<ProviderQueryResult> task) {
            if(task.isSuccessful()){
          ///////// getProviders().size() will return size 1. if email ID is available. 
                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");     
                        }
                    }
                }
            });
}

稍后当用户输入密码并按 SIGNUP 按钮时,您只需更新设置为 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.");
                        }
                    }
                });

您可以看到我使用 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();
}

答案 2 :(得分:-1)

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

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