Я использую метод createAccount()
из Firebase Authentication, и я прикрепил два слушателя: addOnSuccessListener
и addOnFailureListener
Когда я создаю учетную запись и в одновременно с потерей соединения inte rnet учетная запись успешно создана (я вижу ее в консоли Firebase), тогда как вызывается слушатель onFailure
.
Кроме того, когда я создаю эту учетную запись, я сохраняю объект User в Firestore с Task<Void>
, вызываемым асинхронно из метода auth. Проблема в том, что этот пользователь никогда не создается в базе данных Firestore из-за предыдущего сбоя, но в любом случае имеет учетную запись аутентификации.
В результате пользователь может войти в систему, но не существует в базе данных, и поэтому все его поля являются пустыми.
Я не смог найти никаких откатов для методов аутентификации Firebase, поэтому сейчас я вхожу в систему и проверяю, существует ли объект User с тем же адресом электронной почты в базе данных ... Но я не думаю, что это хороший подход
Итак, как справиться с таким сценарием?
EDIT: код, который я использую
firebaseAPI.createAccount(email, password, userName).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
System.out.println("onSuccess: the firebase user is not null.");
final FirebaseUser currentUser = authResult.getUser();
if (currentUser != null) {
// Send an email to verify the new account created
currentUser.sendEmailVerification()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
System.out.println("onSuccess: email verification has been sent.");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("onFailure: failed to send the emailVerification.");
System.out.println("onFailure: " + e.getMessage());
}
});
System.out.println("onComplete: registering the username.");
// Update the display name of the firebaseUser object
final UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder().setDisplayName(userName).build();
currentUser.updateProfile(profileUpdates).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("onFailure: " + e.getMessage());
System.out.println("onFailure: failed to update the user display name.");
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
System.out.println("onSuccess: display name updated.");
System.out.println("onSuccess: writing batch.");
String uid = currentUser.getUid();
// Fields to register in Firestore Database.
final User userToRegister = new User(uid, userName, email, birthDate, lastName, firstName);
// Register the Username in Firestore Database & the user as the same time to rollback everything if something happens.
firebaseAPI.createUser(userToRegister, uid).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
System.out.println("onSuccess: logging the user in.");
onSignUpSuccess(userToRegister);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("onFailure: " + e.getMessage());
System.out.println("onFailure: sending error to the activity");
if (e.getMessage().contains("offline") || e.getMessage().contains("internal error")) {
onSignUpError(SignUpErrorType.INTERNET_FAILED);
}
else {
onSignUpError(SignUpErrorType.GENERIC_ERROR);
}
deleteUser(currentUser);
}
}).addOnCanceledListener(new OnCanceledListener() {
@Override
public void onCanceled() {
System.out.println("onCanceled: batch canceled.");
onSignUpError(SignUpErrorType.GENERIC_ERROR);
deleteUser(currentUser);
}
});
}
});
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("onFailure: " + e.getMessage());
if (e.getMessage().contains("internal error") || e.getMessage().contains("network error")) {
// equals("An internal error has occurred. [ 7: ]")
System.out.println("onFailure: sending error to the activity");
onSignUpError(SignUpErrorType.INTERNET_FAILED);
} else if (e.getMessage().contains("mail")){
System.out.println("onFailure: sending error to the activity");
System.out.println("onFailure: error is : " + e.getMessage());
onSignUpError(SignUpErrorType.EMAIL_ALREADY_TAKEN);
}
else {
System.out.println("onFailure: error is : " + e.getMessage());
onSignUpError(SignUpErrorType.GENERIC_ERROR);
}
}
});
Ошибка в logcat:
I/System.out: onFailure: A network error (such as timeout, interrupted connection or unreachable host) has occurred.