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