web-dev-qa-db-fra.com

Comment attraper une exception Firebase Auth

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();
        }
    }    
});
29
Relm

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());
    }
}
68
Steve Guidetti

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."));
26
kingspeech

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.

8
pdegand59

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)

7
Steven Berdak

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;

                    }
                }
            }
        });
    }
6
mahmoud zaher

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.

2
Itzdsp

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.

2
Anmol Bhardwaj

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();
}
2
RedLEON

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_DISABLED 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.

1
Diego Venâncio

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();

                    }

                    // ...
                }
            });
0
osama dev

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);
                }
            }
0
Mr.hands-on

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();
}
0
AUSiBi

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)
0
Danielvgftv

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();
            }
        }
    });
0
Ra Isse
    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

0
NickUnuchek