Avec Firebase, comment puis-je intercepter une exception spécifique et en informer l’utilisateur gracieusement? Par exemple :
FirebaseAuthInvalidCredentialsException: L'adresse e-mail est incorrecte formaté.
J'utilise le code ci-dessous pour inscrire l'utilisateur à l'aide de l'adresse e-mail et du mot de passe, mais je ne suis pas aussi avancé en Java.
mAuth.createUserWithEmailAndPassword(email, pwd)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
//H.toast(c, task.getException().getMessage());
Log.e("Signup Error", "onCancelled", task.getException());
} else {
FirebaseUser user = mAuth.getCurrentUser();
String uid = user.getUid();
}
}
});
Vous pouvez placer l'exception renvoyée par task.getException
dans un bloc try et intercepter chaque type d'exception susceptible d'être générée par la méthode que vous utilisez.
Voici un exemple tiré de OnCompleteListener
pour la méthode createUserWithEmailAndPassword
.
if(!task.isSuccessful()) {
try {
throw task.getException();
} catch(FirebaseAuthWeakPasswordException e) {
mTxtPassword.setError(getString(R.string.error_weak_password));
mTxtPassword.requestFocus();
} catch(FirebaseAuthInvalidCredentialsException e) {
mTxtEmail.setError(getString(R.string.error_invalid_email));
mTxtEmail.requestFocus();
} catch(FirebaseAuthUserCollisionException e) {
mTxtEmail.setError(getString(R.string.error_user_exists));
mTxtEmail.requestFocus();
} catch(Exception e) {
Log.e(TAG, e.getMessage());
}
}
En plus de la réponse @ pdegand59, j'ai trouvé un code d'erreur dans la bibliothèque Firebase et le test sur Android (le code d'erreur renvoyé). J'espère que cela aide, Cordialement.
("ERROR_INVALID_CUSTOM_TOKEN", "The custom token format is incorrect. Please check the documentation."));
("ERROR_CUSTOM_TOKEN_MISMATCH", "The custom token corresponds to a different audience."));
("ERROR_INVALID_CREDENTIAL", "The supplied auth credential is malformed or has expired."));
("ERROR_INVALID_EMAIL", "The email address is badly formatted."));
("ERROR_WRONG_PASSWORD", "The password is invalid or the user does not have a password."));
("ERROR_USER_MISMATCH", "The supplied credentials do not correspond to the previously signed in user."));
("ERROR_REQUIRES_RECENT_LOGIN", "This operation is sensitive and requires recent authentication. Log in again before retrying this request."));
("ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL", "An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address."));
("ERROR_EMAIL_ALREADY_IN_USE", "The email address is already in use by another account."));
("ERROR_CREDENTIAL_ALREADY_IN_USE", "This credential is already associated with a different user account."));
("ERROR_USER_DISABLED", "The user account has been disabled by an administrator."));
("ERROR_USER_TOKEN_EXPIRED", "The user\'s credential is no longer valid. The user must sign in again."));
("ERROR_USER_NOT_FOUND", "There is no user record corresponding to this identifier. The user may have been deleted."));
("ERROR_INVALID_USER_TOKEN", "The user\'s credential is no longer valid. The user must sign in again."));
("ERROR_OPERATION_NOT_ALLOWED", "This operation is not allowed. You must enable this service in the console."));
("ERROR_WEAK_PASSWORD", "The given password is invalid."));
Utilisez ((FirebaseAuthException)task.getException()).getErrorCode()
pour obtenir le type d'erreur et échouez normalement s'il s'agit du code d'erreur d'un courrier électronique formaté de manière incorrecte.
Malheureusement, je n'ai pas trouvé la liste des codes d'erreur utilisés par Firebase. Déclenchez l'exception une fois, notez le code d'erreur et le code en conséquence.
Si vous voulez simplement afficher un message à l'utilisateur, cela fonctionne. Simple et élégant:
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithEmail:failed", task.getException());
Toast.makeText(LoginActivity.this, "User Authentication Failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
Il semble que la méthode .getMessage () convertisse déjà l’exception en un format utilisable pour nous et tout ce que nous avons à faire est de l’afficher quelque part à l’utilisateur.
(Ceci est mon premier commentaire, critique constructive s'il vous plaît)
Il existe un certain nombre d'exceptions associées à l'autorisation de base de feu. En plus de @kingspeech
Vous devriez utiliser ((FirebaseAuthException)task.getException()).getErrorCode()
pour obtenir le type d'erreur puis le manipuler dans switch
comme ceci:
private void loginUser(String email, String password) {
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
} else {
String errorCode = ((FirebaseAuthException) task.getException()).getErrorCode();
switch (errorCode) {
case "ERROR_INVALID_CUSTOM_TOKEN":
Toast.makeText(MainActivity.this, "The custom token format is incorrect. Please check the documentation.", Toast.LENGTH_LONG).show();
break;
case "ERROR_CUSTOM_TOKEN_MISMATCH":
Toast.makeText(MainActivity.this, "The custom token corresponds to a different audience.", Toast.LENGTH_LONG).show();
break;
case "ERROR_INVALID_CREDENTIAL":
Toast.makeText(MainActivity.this, "The supplied auth credential is malformed or has expired.", Toast.LENGTH_LONG).show();
break;
case "ERROR_INVALID_EMAIL":
Toast.makeText(MainActivity.this, "The email address is badly formatted.", Toast.LENGTH_LONG).show();
etEmail.setError("The email address is badly formatted.");
etEmail.requestFocus();
break;
case "ERROR_WRONG_PASSWORD":
Toast.makeText(MainActivity.this, "The password is invalid or the user does not have a password.", Toast.LENGTH_LONG).show();
etPassword.setError("password is incorrect ");
etPassword.requestFocus();
etPassword.setText("");
break;
case "ERROR_USER_MISMATCH":
Toast.makeText(MainActivity.this, "The supplied credentials do not correspond to the previously signed in user.", Toast.LENGTH_LONG).show();
break;
case "ERROR_REQUIRES_RECENT_LOGIN":
Toast.makeText(MainActivity.this, "This operation is sensitive and requires recent authentication. Log in again before retrying this request.", Toast.LENGTH_LONG).show();
break;
case "ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL":
Toast.makeText(MainActivity.this, "An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address.", Toast.LENGTH_LONG).show();
break;
case "ERROR_EMAIL_ALREADY_IN_USE":
Toast.makeText(MainActivity.this, "The email address is already in use by another account. ", Toast.LENGTH_LONG).show();
etEmail.setError("The email address is already in use by another account.");
etEmail.requestFocus();
break;
case "ERROR_CREDENTIAL_ALREADY_IN_USE":
Toast.makeText(MainActivity.this, "This credential is already associated with a different user account.", Toast.LENGTH_LONG).show();
break;
case "ERROR_USER_DISABLED":
Toast.makeText(MainActivity.this, "The user account has been disabled by an administrator.", Toast.LENGTH_LONG).show();
break;
case "ERROR_USER_TOKEN_EXPIRED":
Toast.makeText(MainActivity.this, "The user\\'s credential is no longer valid. The user must sign in again.", Toast.LENGTH_LONG).show();
break;
case "ERROR_USER_NOT_FOUND":
Toast.makeText(MainActivity.this, "There is no user record corresponding to this identifier. The user may have been deleted.", Toast.LENGTH_LONG).show();
break;
case "ERROR_INVALID_USER_TOKEN":
Toast.makeText(MainActivity.this, "The user\\'s credential is no longer valid. The user must sign in again.", Toast.LENGTH_LONG).show();
break;
case "ERROR_OPERATION_NOT_ALLOWED":
Toast.makeText(MainActivity.this, "This operation is not allowed. You must enable this service in the console.", Toast.LENGTH_LONG).show();
break;
case "ERROR_WEAK_PASSWORD":
Toast.makeText(MainActivity.this, "The given password is invalid.", Toast.LENGTH_LONG).show();
etPassword.setError("The password is invalid it must 6 characters at least");
etPassword.requestFocus();
break;
}
}
}
});
}
Vous pouvez utiliser la méthode steve-guidetti ou pdegand59. J'ai utilisé la méthode de steve-guidetti (il manque deux exceptions)
Pour toutes les exceptions possibles, veuillez trouver ci-dessous réf.
C'est bien documenté ici.
https://firebase.google.com/docs/reference/js/firebase.auth.Auth
Recherchez "createUserWithEmailAndPassword" et trouvez le
Codes d'erreur
auth/email-déjà en cours d'utilisation
Thrown if there already exists an account with the given email address.
e-mail d'authentification/invalide
Thrown if the email address is not valid.
auth/operation-not-allowed
Thrown if email/password accounts are not enabled. Enable email/password accounts in the Firebase Console, under the Auth tab.
authentification/mot de passe faible
Thrown if the password is not strong enough.
Pour les cinq exceptions: Cochez ici
https://firebase.google.com/docs/reference/Android/com/google/firebase/auth/FirebaseAuthException
Ici vous pouvez trouver 5 types différents de AuthException. 4 sous-classes directes connues et 1 sous-classe indirecte
Vous pouvez utiliser la méthode steve-guidetti ou pdegand59.
Si vous envoyez des messages en amont d'un utilisateur à un nuage, implémentez les fonctions de rappel de base Firebase onMessageSent
et onSendError
pour vérifier l'état des messages en amont. En cas d'erreur, onSendError
renvoie un SendException avec un code d'erreur.
Par exemple, si le client tente d'envoyer plus de messages après que la limite de 20 messages est atteinte, il renvoie SendException # ERROR_TOO_MANY_MESSAGES.
J'ai essayé d'autres solutions mais je ne les ai pas aimées.
Et ça:
if (!task.isSuccessful()) {
Exception exc = task.getException();
if (exc.getMessage().contains("The email address is badly formatted.")) {
etUser.setError(getString(R.string.error_wrong_email));
etUser.requestFocus();
}
else
if (exc.getMessage().contains("There is no user record corresponding to this identifier. The user may have been deleted.")) {
etUser.setError(getString(R.string.error_user_not_exist));
etUser.requestFocus();
}
else
if (exc.getMessage().contains("The password is invalid or the user does not have a password")) {
etPass.setError(getString(R.string.error_wrong_password));
etPass.requestFocus();
}
Log.w(TAG, "signInWithEmail:failed", task.getException());
Toast.makeText(AuthActivity.this, R.string.auth_failed,
Toast.LENGTH_SHORT).show();
}
LOGIN_EXCEPTIONS
FirebaseAuthException
- Exception générique liée à l'authentification Firebase. Vérifiez le code d'erreur et le message pour plus de détails.
ERROR_USER_DISABLE
D si l'utilisateur a été désactivé (par exemple, dans la console Firebase)
ERROR_USER_NOT_FOUND
si l'utilisateur a été supprimé (par exemple, dans la console Firebase ou dans une autre instance de cette application)
ERROR_USER_TOKEN_EXPIRED
si le jeton de l'utilisateur a été révoqué dans le backend. Cela se produit automatiquement si les informations d'identification de l'utilisateur changent sur un autre périphérique (par exemple, lors d'un événement de modification du mot de passe).
ERROR_INVALID_USER_TOKEN
si le jeton de l'utilisateur est mal formé. Cela ne devrait pas arriver dans des circonstances normales.
mAuth.signInWithEmailAndPassword(login, pass)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful())
{
}else if (task.getException() instanceof FirebaseAuthInvalidUserException) {
}else if(((FirebaseAuthException) task.getException()).getErrorCode().equals("ERROR_USER_DISABLED"))
{
}else if(((FirebaseAuthException) task.getException()).getErrorCode().equals("ERROR_USER_NOT_FOUND "))
{
}else if(((FirebaseAuthException) task.getException()).getErrorCode().equals("ERROR_USER_TOKEN_EXPIRED "))
{
}else if(((FirebaseAuthException) task.getException()).getErrorCode().equals("ERROR_INVALID_USER_TOKEN "))
{
}
}
});
REGISTER_EXCEPTIONS
FirebaseAuthEmailException
Représente l'exception résultant d'une tentative d'envoi d'un courrier électronique via Firebase Auth (par exemple, un courrier électronique de réinitialisation de mot de passe).
FirebaseAuthInvalidCredentialsException
- Lancé lorsqu'un ou plusieurs des identifiants transmis à une méthode ne parviennent pas à identifier et/ou authentifier l'utilisateur soumis à cette opération. Inspectez le code d'erreur et le message pour trouver la cause spécifique.
FirebaseAuthWeakPasswordException
- Lancé lors de l'utilisation d'un mot de passe faible (moins de 6 caractères) pour créer un nouveau compte ou pour mettre à jour le mot de passe d'un compte existant. Utilisez getReason () pour obtenir un message indiquant le motif de l'échec de la validation, que vous pouvez afficher à vos utilisateurs.
vous pouvez utiliser ceci:
mAuth.getCurrentUser().linkWithCredential(authCredential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "linkWithCredential:success");
} else {
Log.w(TAG, "linkWithCredential:failure", task.getException());
Toast.makeText(getApplicationContext(), "Authentication failed. " + task.getException().toString, Toast.LENGTH_SHORT).show();
}
// ...
}
});
Dans le passé, nous utilisions la méthode getErrorCode () pour obtenir le type d'erreur et échouer de manière appropriée. GetErrorCode () est obsolète avec les versions les plus récentes de l'api. Nous devrions utiliser response.getError (). GetErrorCode () à la place
com.firebase.ui.auth.IdpResponse
@Deprecated
public int getErrorCode()
Get the error code for a failed sign in
Deprecated use getError() instead
Donc pour par exemple.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
IdpResponse response = IdpResponse.fromResultIntent(data);
// Successfully signed in
if (resultCode == RESULT_OK) {
//dbHandler = DBMS.getInstance(this);
FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();
FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata();
// initialize profile first
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) {
//start main activity after profile setup
startActivity(new Intent(this, MainActivity.class));
return;
} else {
// This is an existing user
// show them a welcome back screen.
startActivity(new Intent(this, MainActivity.class));
return;
}
} else {
// Sign in failed
// check response for error code
if (response == null) {
// User pressed back button
showSnackbar(R.string.sign_in_cancelled);
return;
}
if (response.getError().getErrorCode() == ErrorCodes.NO_NETWORK) {
showSnackbar(R.string.no_internet_connection);
return;
}
if (response.getError().getErrorCode() == ErrorCodes.UNKNOWN_ERROR) {
showSnackbar(R.string.unknown_error);
return;
}
}
showSnackbar(R.string.unknown_sign_in_response);
}
}
Essayez ce qui suit:
if (task.isSuccessful()) {
//Toast.makeText(getContext(),"Registration successful", Toast.LENGTH_SHORT).show();
try {
Toast.makeText(getContext(),"Registration successful", Toast.LENGTH_SHORT).show();
throw task.getException();
}
// if user enters wrong email.
catch (FirebaseAuthWeakPasswordException weakPassword) {
Log.d("Registration Error", "onComplete: weak_password");
// TODO: take your actions!
}
// if user enters wrong password.
catch (FirebaseAuthInvalidCredentialsException malformedEmail) {
Log.d("Registration Error", "onComplete: malformed_email");
// TODO: Take your action
}
catch (FirebaseAuthUserCollisionException existEmail) {
Log.d("Registration Error", "onComplete: exist_email");
// TODO: Take your action
}
catch (Exception e) {
Log.d("Registration Error", "onComplete: " + e.getMessage());
}
} else {
//Toast.makeText(getContext(), "ERROR, Please try again.", Toast.LENGTH_SHORT).show();
Toast.makeText(getContext(), task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
C'est la méthode que j'utilise dans Kotlin
fun handleErrorsFirebaseAuth(err:FirebaseAuthException): String {
when (err.errorCode) {
"ERROR_INVALID_EMAIL" -> return "Introduce un email válido"
"ERROR_EMAIL_ALREADY_IN_USE" -> return "Este email ya está en uso , usa otra cuenta o recupera la contraseña"
"ERROR_WEAK_PASSWORD" -> return "La contraseña tiene que ser de mínimo 6 carácteres"
"ERROR_WRONG_PASSWORD" -> return "La contraseña es incorrecta"
"ERROR_USER_DISABLED" -> return "Usuario deshabilitado, has infringido alguna norma"
"ERROR_USER_NOT_FOUND" -> return "No encontramos su cuenta. ¿El email es correcto? , contacte con nosotros mediante instagram @gobarberco"
else -> {
return "Se ha producido un error"
}
}
}
Utilisation:
val messageError = handleErrorsFirebaseAuth(task.exception as FirebaseAuthException)
Pour attraper une base de feu Exception est facile, vous devriez ajouter .addOnFailureListener
après avoir ajouté .addOnCompleteListener
comme ceci:
private void login_user(String email, String password) {
mAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
startActivity(intent);
finish();
}if(!task.isSuccessful()){
// To know The Excepton
//Toast.makeText(LoginActivity.this, ""+task.getException(), Toast.LENGTH_LONG).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if( e instanceof FirebaseAuthInvalidUserException){
Toast.makeText(LoginActivity.this, "This User Not Found , Create A New Account", Toast.LENGTH_SHORT).show();
}
if( e instanceof FirebaseAuthInvalidCredentialsException){
Toast.makeText(LoginActivity.this, "The Password Is Invalid, Please Try Valid Password", Toast.LENGTH_SHORT).show();
}
if(e instanceof FirebaseNetworkException){
Toast.makeText(LoginActivity.this, "Please Check Your Connection", Toast.LENGTH_SHORT).show();
}
}
});
try {
throw task.getException();
} catch(FirebaseAuthException e) {
switch (e.getErrorCode()){
case "ERROR_WEAK_PASSWORD":
Toast.makeText(this, "The given password is invalid.", Toast.LENGTH_SHORT).show();
break;
//and other
}
}
codes d'erreur: https://stackoverflow.com/a/38244409/2425851