Come catturare eccezioni specifiche dell’autenticazione Firebase

Usando Firebase, come faccio a catturare un’eccezione specifica e a comunicarlo gentilmente all’utente? Per esempio :

FirebaseAuthInvalidCredentialsException: l’indirizzo email è formattato in modo errato.

Sto usando il codice qui sotto per iscrivere l’utente tramite email e password, ma non sono così avanzato in java.

mAuth.createUserWithEmailAndPassword(email, pwd) .addOnCompleteListener(this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task 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(); } } }); 

È ansible lanciare l’eccezione restituita da task.getException all’interno di un blocco try e catturare ogni tipo di eccezione che può essere generata dal metodo che si sta utilizzando.

Ecco un esempio da OnCompleteListener per il metodo 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()); } } 

Oltre alla risposta @ pdegand59, ho trovato alcuni codici di errore nella libreria Firebase e test su Android (il codice di errore restituito). Spero che questo aiuti, saluti.

  ("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 malformsd 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.")); 

È necessario utilizzare ((FirebaseAuthException)task.getException()).getErrorCode() per ottenere il tipo di errore e fallire correttamente se questo è il codice di errore per una e-mail con formattazione errata.

Purtroppo, non sono riuscito a trovare l’elenco dei codici di errore usati da Firebase. Attivare l’eccezione una volta, annotare il codice di errore e il codice di conseguenza.

Se vuoi semplicemente mostrare un messaggio all’utente, questo funziona. Semplice ed elegante:

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

Sembra che il metodo .getMessage () converta l’eccezione in un formato utilizzabile per noi e tutto ciò che dobbiamo fare è mostrarlo da qualche parte all’utente.

(Questo è il mio primo commento, critica costruttiva per favore)

Esistono numerose eccezioni associate all’authorization di Firebase. Oltre a @kingspeech

Dovresti usare ((FirebaseAuthException)task.getException()).getErrorCode() per ottenere il tipo di errore e quindi gestirlo in switch come questo:

 private void loginUser(String email, String password) { mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task 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 malformsd 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; } } } }); } 

Se si inviano messaggi upstream da utente a cloud, implementare le funzioni di callback firebase onMessageSent e onSendError per verificare lo stato dei messaggi upstream. In caso di errore, onSendError restituisce una SendException con un codice di errore.

Ad esempio, se il client tenta di inviare più messaggi dopo il raggiungimento del limite di 20 messaggi, restituisce SendException # ERROR_TOO_MANY_MESSAGES.

È ansible utilizzare il metodo steve-guidetti o pdegand59. Ho usato il metodo di steve-guidetti (mancano due eccezioni)

Per tutte le possibili eccezioni si prega di trovare sotto rif.

È ben documentato qui.

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

Cerca “createUserWithEmailAndPassword” e trova il file

Codici di errore

auth / email-già-in-uso

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

auth / invalid-mail

 Thrown if the email address is not valid. 

auth / operazione-non-permesso

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

auth / debole la password

 Thrown if the password is not strong enough. 

Per tutte e cinque le eccezioni: controllare qui

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

Qui puoi trovare 5 diversi tipi di AuthException. 4 sottoclass Direct diretta e 1 sottoclass indiretta

È ansible utilizzare il metodo steve-guidetti o pdegand59.

Ho provato altre soluzioni ma non mi piacevano.

Che dire di questo:

 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 – Eccezione generica correlata all’autenticazione Firebase. Controlla il codice di errore e il messaggio per maggiori dettagli.

ERROR_USER_DISABLE D se l’utente è stato disabilitato (ad esempio, nella console Firebase)

ERROR_USER_NOT_FOUND se l’utente è stato cancellato (ad esempio, nella console Firebase o in un’altra istanza di questa app)

ERROR_USER_TOKEN_EXPIRED se il token dell’utente è stato revocato nel back-end. Ciò accade automaticamente se le credenziali dell’utente cambiano in un altro dispositivo (ad esempio, in caso di un evento di modifica della password).

ERROR_INVALID_USER_TOKEN se il token dell’utente non è valido. Questo non dovrebbe accadere in circostanze normali.

 mAuth.signInWithEmailAndPassword(login, pass) .addOnCompleteListener(this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task 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 

Rappresenta l’eccezione che è il risultato di un tentativo di inviare un’e-mail tramite l’autenticazione Firebase (ad es. Una e-mail di reimpostazione della password)

FirebaseAuthInvalidCredentialsException : generata quando una o più credenziali passate a un metodo non riescono a identificare e / o autenticare l’object utente di tale operazione. Ispezionare il codice di errore e il messaggio per scoprire la causa specifica.

FirebaseAuthWeakPasswordException – generata quando si utilizza una password debole (meno di 6 caratteri) per creare un nuovo account o per aggiornare la password di un account esistente. Utilizza getReason () per ottenere un messaggio con il motivo per cui la convalida non è riuscita e può essere mostrata ai tuoi utenti.

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

codici di errore: https://stackoverflow.com/a/38244409/2425851

Per catturare un firebase L’eccezione è semplice, dovresti aggiungere .addOnFailureListener dopo aver aggiunto .addOnCompleteListener questo modo:

  private void login_user(String email, String password) { mAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task 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(); } } }); 

In passato abbiamo usato getErrorCode () per ottenere il tipo di errore e fallire con garbo. Con le versioni più recenti di api, getErrorCode () è deprecato. Dovremmo usare invece response.getError (). GetErrorCode ()

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

Quindi per es

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

Prova quanto segue:

 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 malformsdEmail) { Log.d("Registration Error", "onComplete: malformsd_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(); }