J'utilise l'authentification par téléphone firebase. Lorsqu'un utilisateur crée un compte en utilisant un numéro de téléphone et la prochaine fois, il crée un compte avec le même numéro de téléphone .__ Puis je veux montrer un message disant que le compte existe déjà
Afin de détecter si ce numéro de téléphone a déjà été utilisé pour l'enregistrement du compte, vous ne pouvez pas compter uniquement sur la table d'authentification par défaut. Mais il faut aussi utiliser la base de données Firebase pour créer une table utilisateur fictive pour vérifier.
Par exemple, vous pouvez créer un arbre json pour enregistrer les données utilisateur dans la base de données temps réel dans un format structuré comme ceci:
Et votre code devrait ressembler à:
Sur le morceau de code de connexion réussie/enregistrement d'utilisateur} _:
DatabaseRef userRef = FirebaseDatabase.getInstance.getRef("users");
userRef.orderByChild("telNum").equalTo(phoneNumber).addListenerForSingleValueEvent(new ValueEventListener() {
if (dataSnapshot.getValue() != null){
//it means user already registered
//Add code to show your Prompt
showPrompt();
}else{
//It is new users
//write an entry to your user table
//writeUserEntryToDB();
}
}
onTask
vérification du résultat FirebaseAuthUserCollisionException
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
Toast.makeText(Signup.this, "User already exist.", Toast.LENGTH_SHORT).show();
}
Je l'ai fait dans mon projet et cela fonctionne parfaitement, vous pouvez l'utiliser, vous pouvez utiliser votre numéro de téléphone au lieu de "deviceId".
mFirebaseDatabaseRefrence.orderByChild("deviceId").equalTo(deviceId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Log.d(TAG, "Datasnap Shots: " + dataSnapshot.getValue());
/* if alredy exist and check for first time, second time isExist=true*/
if (!isExist) {
for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
UserbasicInfo user = userSnapshot.getValue(UserbasicInfo.class);
Toast.makeText(UserInfoActivity.this, "User already exist...!", Toast.LENGTH_SHORT).show();
}
}
isExist = true;
} else {
isExist = false;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
/*if not exist add data to firebase*/
Runnable runnable = new Runnable() {
@Override
public void run() {
Log.d(TAG, "isExist: " + isExist);
if (!isExist) {
addDataToDB(false);
} else {
addDataToDB(true);
}
}
};
new Handler().postDelayed(runnable, 5000);
Pour la solution,
Après l'inscription, veuillez saisir une entrée dans la base de données qui crée l'identité de l'utilisateur. Ainsi, la prochaine fois, vous pourrez identifier l'utilisateur déjà inscrit.
Après vérification de la vérification OTP dans la base de données RealTime, le numéro de mobile existe déjà, il doit donc déjà saisir ce numéro de téléphone particulier.
J'ai traité de cette façon. Firebase crée une exception en cas d'erreur d'erreur lors de l'authentification et d'autres éléments non valides. Nous devons simplement les gérer et en informer l'utilisateur.
exemple de code:
private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "signInWithCredential:success");
//do something on success
} else {
//handle the error here
showInfoToUser(task)
}
}
}
});
}
et vérifiez quel type d'erreur nous obtenons en vérifiant les exceptions ici
private void showInfoToUser(Task<AuthResult> task) {
//here manage the exceptions and show relevant information to user
hideProgressDialog();
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
showSnackBar(getString(R.string.user_already_exist_msg));
} else if (task.getException() instanceof FirebaseAuthWeakPasswordException) {
showSnackBar(task.getException().getMessage());
} else if (task.getException() instanceOf FirebaseAuthInvalidCredentialsException){
//invalid phone /otp
showSnackBar(task.getException().getMessage());
}
else {
showSnackBar(getString(R.string.error_common));
}
}