Je souhaite vérifier lorsqu'un utilisateur tente de s'inscrire avec createUserWithEmailAndPassword()
dans la méthode d'authentification de l'utilisateur Firebase. Cet utilisateur est déjà enregistré auprès de mon application.
Lorsque l'utilisateur essaie de créer un utilisateur avec la même adresse électronique, la réponse de la tâche sera "Réponse: l'adresse électronique est déjà utilisée par un autre compte."
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());
}
}
});
Pour détecter si un utilisateur avec cette adresse email existe déjà, vous pouvez détecter le moment où l'appel à createUserWithEmailAndPassword ()
échoue avec auth/email-already-in-use
. Je vois que @Srinivasan vient de publier une réponse à cette question.
Vous pouvez également détecter qu'une adresse électronique est déjà utilisée en appelant fetchSignInMethodsForEmail()
(précédemment appelé fetchProvidersForEmail()
).
Tout d’abord, vous devez vous assurer que cette restriction est activée dans la console Firebase (paramètres de compte et d’adresse électronique). Regardez la réponse de @ Srinivasan.
Ensuite, faites ceci dans votre code 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));
}
// ...
}
});
C'est là que le truc se passe:
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
Toast.makeText(SignUpActivity.this,
"User with this email already exist.", Toast.LENGTH_SHORT).show();
Plusieurs exceptions peuvent être levées lors de l’enregistrement d’un utilisateur avec adresse email et mot de passe, mais celle qui nous intéresse est la FirebaseAuthUserCollisionException
. Comme son nom l'indique, cette exception est levée si l'email existe déjà. Si l'exception levée est une instance de cette classe, informez l'utilisateur.
Comme pratique de @ Frank, voici le code d'utilisation de 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];
}
Je cherchais dans ce genre de condition où nous pouvons détecter si l'utilisateur existe ou non et effectuer l'enregistrement et la connexion fetchProvidersForEmail
est la meilleure option pour le moment. J'ai trouvé this tutorial. J'espère que ça vous aide aussi!
Ajoutez le code ci-dessous à MainActivity.Java file.Lorsque l'utilisateur tente de s'enregistrer avec la même adresse électronique, un message "L'adresse électronique est déjà utilisée par un autre compte" apparaîtra sous la forme d'un 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();
}
}
});
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();
}
});