Как перехватить исключения, специфичные для аутентификации Firebase
Используя Firebase, как мне перехватить конкретное исключение и изящно сообщить об этом пользователю? Например :
Исключение FirebaseAuthInvalidCredentialsException: адрес электронной почты неправильно отформатирован.
Я использую приведенный ниже код для регистрации пользователя с использованием электронной почты и пароля, но я не настолько продвинут в 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();
}
}
});
Переведено автоматически
Ответ 1
Вы можете создать исключение, возвращаемое task.getException
внутри блока try, и перехватить каждый тип исключения, который может быть сгенерирован используемым вами методом.
Вот пример из OnCompleteListener
для 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());
}
}
Ответ 2
В дополнение к ответу @pdegand59, я нашел некоторый код ошибки в библиотеке Firebase и протестировал на Android (возвращенный код ошибки). Надеюсь, это поможет, с уважением.
("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."));
("ERROR_MISSING_EMAIL", "An email address must be provided.";
Ответ 3
Существует ряд исключений, связанных с аутентификацией firebase. В дополнение к @kingspeech
Вы должны использовать ((FirebaseAuthException)task.getException()).getErrorCode()
для получения типа ошибки, а затем обработать ее в switch
таком виде :
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;
}
}
}
});
}
Ответ 4
Решение с использованием Kotlin
fun signInWithEmail(email: String, passKey: String) {
FirebaseAuth.getInstance().signInWithEmailAndPassword(email, passKey).addOnSuccessListener {
it.user?.let {
authResultOperation.postValue(AuthResultOperation.OnSuccessSignIn)
}
}.addOnFailureListener {
val errorCode = (it.exception as FirebaseAuthException).errorCode
val errorMessage = authErrors[errorCode] ?: R.string.error_login_default_error
Toast.makeText(context, context.getString(errorMessage),Toast.LENGTH_LONG).show()
}
}
Объяснение: По сути, это просто сопоставление кодов ошибок firebase с пользовательским строковым ресурсом.
val authErrors = mapOf("ERROR_INVALID_CUSTOM_TOKEN" to R.string.error_login_custom_token,
"ERROR_CUSTOM_TOKEN_MISMATCH" to R.string.error_login_custom_token_mismatch,
"ERROR_INVALID_CREDENTIAL" to R.string.error_login_credential_malformed_or_expired,
"ERROR_INVALID_EMAIL" to R.string.error_login_invalid_email,
"ERROR_WRONG_PASSWORD" to R.string.error_login_wrong_password,
"ERROR_USER_MISMATCH" to R.string.error_login_user_mismatch,
"ERROR_REQUIRES_RECENT_LOGIN" to R.string.error_login_requires_recent_login,
"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL" to R.string.error_login_accounts_exits_with_different_credential,
"ERROR_EMAIL_ALREADY_IN_USE" to R.string.error_login_email_already_in_use,
"ERROR_CREDENTIAL_ALREADY_IN_USE" to R.string.error_login_credential_already_in_use,
"ERROR_USER_DISABLED" to R.string.error_login_user_disabled,
"ERROR_USER_TOKEN_EXPIRED" to R.string.error_login_user_token_expired,
"ERROR_USER_NOT_FOUND" to R.string.error_login_user_not_found,
"ERROR_INVALID_USER_TOKEN" to R.string.error_login_invalid_user_token,
"ERROR_OPERATION_NOT_ALLOWED" to R.string.error_login_operation_not_allowed,
"ERROR_WEAK_PASSWORD" to R.string.error_login_password_is_weak)
Строковые ресурсы (не стесняйтесь изменять их в соответствии с вашими требованиями)
<resources>
<string name="error_login_custom_token">The custom token format is incorrect. Please check the documentation.</string>
<string name="error_login_custom_token_mismatch">The custom token corresponds to a different audience.</string>
<string name="error_login_credential_malformed_or_expired">The supplied auth credential is malformed or has expired.</string>
<string name="error_login_invalid_email">The email address is badly formatted.</string>
<string name="error_login_wrong_password">The password is invalid or the user does not have a password.</string>
<string name="error_login_user_mismatch">The supplied credentials do not correspond to the previously signed in user.</string>
<string name="error_login_requires_recent_login">This operation is sensitive and requires recent authentication. Log in again before retrying this request.</string>
<string name="error_login_accounts_exits_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.</string>
<string name="error_login_email_already_in_use">The email address is already in use by another account.</string>
<string name="error_login_credential_already_in_use">This credential is already associated with a different user account.</string>
<string name="error_login_user_disabled">The user account has been disabled by an administrator.</string>
<string name="error_login_user_not_found">There is no user record corresponding to this identifier. The user may have been deleted.</string>
<string name="error_login_operation_not_allowed">This operation is not allowed. You must enable this service in the console.</string>
<string name="error_login_password_is_weak">The given password is invalid.</string>
<string name="error_login_user_token_expired">The user\'s credential is no longer valid. The user must sign in again</string>
<string name="error_login_invalid_user_token">The user\'s credential is no longer valid. The user must sign in again.</string>
</resources>