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