wake-up-neo.com

Wie fange ich Firebase Auth-spezifische Ausnahmen ab?

Wie fange ich mit Firebase eine bestimmte Ausnahme ein und sage dem Benutzer dies ordnungsgemäß? Z.B :

FirebaseAuthInvalidCredentialsException: Die E-Mail-Adresse lautet formatiert.

Ich benutze den folgenden Code, um den Benutzer mit E-Mail und Passwort zu registrieren, aber in Java bin ich nicht so fortgeschritten. 

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

Sie können die von task.getException zurückgegebene Exception in einen try-Block werfen und jede Art von Exception abfangen, die möglicherweise von der von Ihnen verwendeten Methode ausgelöst wird.

Hier ist ein Beispiel aus der OnCompleteListener für die createUserWithEmailAndPassword-Methode.

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

Neben der Antwort von @ pdegand59 habe ich einen Fehlercode in der Firebase-Bibliothek gefunden und auf Android getestet (der zurückgegebene Fehlercode). Ich hoffe, das hilft, Grüße.

 ("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

Sie sollten ((FirebaseAuthException)task.getException()).getErrorCode() verwenden, um die Art des Fehlers abzurufen, und dies ist ein Fehler, wenn dies der Fehlercode für eine falsch formatierte E-Mail ist.

Leider konnte ich die Liste der von Firebase verwendeten Fehlercodes nicht finden. Lösen Sie die Ausnahme einmal aus, und notieren Sie sich den Fehlercode und den Code entsprechend.

8
pdegand59

Wenn Sie dem Benutzer einfach eine Nachricht anzeigen möchten, funktioniert dies. Einfach und elegant:

if (!task.isSuccessful()) {
    Log.w(TAG, "signInWithEmail:failed", task.getException());
    Toast.makeText(LoginActivity.this, "User Authentication Failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}

Es scheint, dass die .getMessage () -Methode die Ausnahme für uns bereits in ein verwendbares Format konvertiert, und wir müssen das nur irgendwo für den Benutzer anzeigen.

(Dies ist mein erster Kommentar, bitte konstruktive Kritik)

7
Steven Berdak

Firebase auth hat eine Reihe von Ausnahmen. Zusätzlich zu @kingspeech

Sie sollten ((FirebaseAuthException)task.getException()).getErrorCode() verwenden, um den Fehlertyp zu erhalten und dann in switch wie folgt behandeln:

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

Sie können entweder die Methode steve-guidetti oder pdegand59 verwenden. Ich habe die Methode von steve-guidetti verwendet (zwei Ausnahmen fehlen)

Für alle möglichen Ausnahmen finden Sie unten die Referenz.

Es ist hier gut dokumentiert.

https://firebase.google.com/docs/reference/js/firebase.auth.Auth

Suchen Sie nach "createUserWithEmailAndPassword" und suchen Sie nach 

Fehlercodes

auth/E-Mail-bereits verwendet

Thrown if there already exists an account with the given email address. 

auth/invalid-email

Thrown if the email address is not valid.

auth/operation-nicht erlaubt

Thrown if email/password accounts are not enabled. Enable email/password accounts in the Firebase Console, under the Auth tab.

auth/Schwaches Passwort

Thrown if the password is not strong enough. 

Für alle fünf Ausnahmen: Hier klicken

https://firebase.google.com/docs/reference/Android/com/google/firebase/auth/FirebaseAuthException

Hier finden Sie 5 verschiedene Arten von AuthException. 4 Bekannte direkte Unterklasse und 1 indirekte Unterklasse 

Sie können entweder die Methode steve-guidetti oder pdegand59 verwenden.

2
Itzdsp

Wenn Sie Upstream-Nachrichten vom Benutzer an die Cloud senden, implementieren Sie die Firebase-Callback-Funktionen onMessageSent und onSendError, um den Status der Upstream-Nachrichten zu überprüfen. In Fehlerfällen gibt onSendError eine SendException mit einem Fehlercode zurück.

Wenn der Client beispielsweise versucht, mehr Nachrichten zu senden, nachdem das Limit von 20 Nachrichten erreicht ist, gibt er SendException # ERROR_TOO_MANY_MESSAGES zurück.

2
Anmol Bhardwaj

Ich habe eine andere Lösung ausprobiert, aber sie hat mir nicht gefallen. 

Was ist mit diesem:

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 - Generische Ausnahme für die Firebase-Authentifizierung. Überprüfen Sie den Fehlercode und die Nachricht auf weitere Details.

ERROR_USER_DISABLED, wenn der Benutzer deaktiviert wurde (z. B. in der Firebase-Konsole)

ERROR_USER_NOT_FOUND, wenn der Benutzer gelöscht wurde (z. B. in der Firebase-Konsole oder in einer anderen Instanz dieser App)

ERROR_USER_TOKEN_EXPIRED, wenn das Token des Benutzers im Backend gesperrt wurde. Dies geschieht automatisch, wenn sich die Anmeldeinformationen des Benutzers auf einem anderen Gerät ändern (z. B. bei einem Ereignis zur Kennwortänderung).

ERROR_INVALID_USER_TOKEN, wenn das Token des Benutzers fehlerhaft ist. Dies sollte unter normalen Umständen nicht passieren.

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

Stellt die Ausnahme dar, die auf einen Versuch zurückzuführen ist, eine E-Mail über Firebase Auth zu senden (z. B. eine E-Mail zum Zurücksetzen des Kennworts).

FirebaseAuthInvalidCredentialsException - Wird ausgelöst, wenn einer oder mehrere der an eine Methode übergebenen Berechtigungsnachweise den Benutzersubjekt der Operation nicht identifizieren und/oder authentifizieren. Überprüfen Sie den Fehlercode und die Fehlermeldung, um die genaue Ursache herauszufinden.

FirebaseAuthWeakPasswordException - Wird ausgelöst, wenn ein schwaches Kennwort (weniger als 6 Zeichen) verwendet wird, um ein neues Konto zu erstellen oder das Kennwort eines vorhandenen Kontos zu aktualisieren. Verwenden Sie getReason (), um eine Nachricht mit dem Grund zu erhalten, warum die Überprüfung fehlgeschlagen ist und Sie Ihren Benutzern anzeigen können.

1
Diego Venâncio

sie können dies verwenden:

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

In der Vergangenheit haben wir getErrorCode () verwendet, um den Fehlertyp abzurufen und fehlerfrei auszufallen. Bei den neueren Versionen der API ist getErrorCode () veraltet. Wir sollten response.getError (). GetErrorCode () verwenden

com.firebase.ui.auth.IdpResponse
@Deprecated 
public int getErrorCode()
Get the error code for a failed sign in

Deprecated use getError() instead

Also für z.

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

Versuche Folgendes:

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

Dies ist die Methode, die ich in Kotlin verwende

    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"
            }

        }

    }

Benutzen:

val messageError =  handleErrorsFirebaseAuth(task.exception as FirebaseAuthException)
0
Danielvgftv

Um eine Firebase zu erfassen, ist Ausnahme einfach, Sie sollten .addOnFailureListener hinzufügen, nachdem Sie .addOnCompleteListener folgendermaßen hinzugefügt haben:

 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
                    }
        }

fehlercodes: https://stackoverflow.com/a/38244409/2425851

0
NickUnuchek