我想检查当用户尝试在 Firebase 用户身份验证方法中使用
createUserWithEmailAndPassword()
进行注册时,该用户已在我的应用程序中注册。
要检测具有该电子邮件地址的用户是否已存在,您可以检测对
createUserWithEmailAndPassword ()
的调用何时失败并显示 auth/email-already-in-use
。我看到@Srinivasan 刚刚发布了一个答案。
fetchSignInMethodsForEmail()
来检测电子邮件地址已被使用。
通常的流程是,您首先要求用户输入他们的电子邮件地址,然后拨打 fetchSignInMethodsForEmail
,然后将他们移动到一个屏幕,要求提供其余的注册详细信息(如果是新的),或者向他们展示他们已经注册的提供商。
当用户尝试创建具有相同电子邮件地址的用户时,任务响应将是 “响应:该电子邮件地址已被另一个帐户使用。”
mFirebaseAuth.createUserWithEmailAndPassword(email,password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
//User registered successfully
}else{
Log.i("Response","Failed to create user:"+task.getException().getMessage());
}
}
});
首先,您需要确保在 Firebase 控制台(帐户和电子邮件地址设置)中启用了该限制。看看@Srinivasan 的回答。
然后,在您的 java 代码中执行此操作:
firebaseAuthenticator.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
Toast.makeText(SignUpActivity.this, "User with this email already exist.", Toast.LENGTH_SHORT).show();
}
} else {
sendVerificationEmail();
startActivity(new Intent(SignUpActivity.this, DetailsCaptureActivity.class));
}
// ...
}
});
这就是窍门发生的地方:
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
Toast.makeText(SignUpActivity.this,
"User with this email already exist.", Toast.LENGTH_SHORT).show();
使用电子邮件和密码注册用户时可能会引发一些异常,但我们感兴趣的是
FirebaseAuthUserCollisionException
。顾名思义,如果电子邮件已经存在,则会抛出此异常。如果抛出的异常是此类的实例,请让用户知道。
作为 @Frank 答案的实践,这里是使用
fetchProvidersForEmail()
的代码
private boolean checkAccountEmailExistInFirebase(String email) {
FirebaseAuth mAuth = FirebaseAuth.getInstance();
final boolean[] b = new boolean[1];
mAuth.fetchProvidersForEmail(email).addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>() {
@Override
public void onComplete(@NonNull Task<ProviderQueryResult> task) {
b[0] = !task.getResult().getProviders().isEmpty();
}
});
return b[0];
}
参见:管理用户
UserRecord userRecord = FirebaseAuth.getInstance().getUserByEmail(email);
System.out.println("Successfully fetched user data: " + userRecord.getEmail());
此方法返回与所提供的电子邮件对应的用户的 UserRecord 对象。
如果提供的电子邮件不属于现有用户或由于任何其他原因无法获取用户,Admin SDK 会抛出错误。有关错误代码的完整列表,包括说明和解决步骤,请参阅管理员身份验证 API 错误。
private ProgressDialog progressDialog;
progressDialog.setMessage("Registering, please Wait...");
progressDialog.show();
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
//checking if success
if (task.isSuccessful()) {
//Registration was successfull:
Toast.makeText(RegistrationActivity.this, "Successfully registered!", Toast.LENGTH_LONG).show();
} else {
//Registration failed:
//task.getException().getMessage() makes the magic
Toast.makeText(RegistrationActivity.this, "Registration failed! " + "\n" + task.getException().getMessage(), Toast.LENGTH_LONG).show();
}
progressDialog.dismiss();
}
});
将以下代码添加到MainActivity.java文件中。当用户尝试使用相同的电子邮件地址注册时,将会以Toast
的形式弹出一条消息“该电子邮件地址已被另一个帐户使用”mAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(!task.isSuccessful()){
Toast.makeText(MainActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
if(task.isSuccessful()){
Toast.makeText(MainActivity.this, "Sign up successfull", Toast.LENGTH_SHORT).show();
}
}
});
fetchProvidersForEmail() 已重命名为 fetchSignInMethodsForEmail() 出于安全原因已弃用,请使用以下内容:
firebaseAuth.createUserWithEmailAndPassword(
email, password
).addOnCompleteListener { createTask ->
if (createTask.isSuccessful) {
//openMainScreen()
}
else if(createTask.exception is FirebaseAuthUserCollisionException){
// user email already created
firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener{ signInTask ->
if(signInTask.isSuccessful){
//openMainScreen()
}
else {
//toast("error signing in")
}
}
}
else {
//toast("error signing up")
}
}
您无需执行任何操作,因为 Firebase 后端会完成这项工作。
除非您指的是应用程序的重新验证。 拿一个场景来举例,w