Ошибка аутентификации FireBase Android - PullRequest
3 голосов
/ 18 июня 2020

Я использую метод createAccount() из Firebase Authentication, и я прикрепил два слушателя: addOnSuccessListener и addOnFailureListener

  1. Когда я создаю учетную запись и в одновременно с потерей соединения inte rnet учетная запись успешно создана (я вижу ее в консоли Firebase), тогда как вызывается слушатель onFailure.

  2. Кроме того, когда я создаю эту учетную запись, я сохраняю объект 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.
...