身份验证失败FireBase Android

身份验证失败FireBase Android,android,firebase,firebase-authentication,Android,Firebase,Firebase Authentication,我正在使用Firebase身份验证中的createAccount()方法,并附加了两个侦听器: addOnSuccessListener和addOnFailureListener 当我创建一个帐户,同时失去internet连接时,该帐户被成功创建(我可以在Firebase控制台中看到),而onFailure侦听器被调用 另外,当我创建此帐户时,我正在Firestore中保存一个用户对象,其中包含一个从auth方法异步调用的任务。问题是,由于之前的故障,该用户从未在Firestore数据库中创建,

我正在使用Firebase身份验证中的
createAccount()
方法,并附加了两个侦听器:
addOnSuccessListener
addOnFailureListener

  • 当我创建一个帐户,同时失去internet连接时,该帐户被成功创建(我可以在Firebase控制台中看到),而
    onFailure
    侦听器被调用

  • 另外,当我创建此帐户时,我正在Firestore中保存一个用户对象,其中包含一个从auth方法异步调用的
    任务。问题是,由于之前的故障,该用户从未在Firestore数据库中创建,但仍然拥有身份验证帐户

  • 结果是用户可以登录,但数据库中不存在,因此他的所有字段都为空

    我在Firebase auth方法上找不到任何回滚,所以现在我正在登录用户,同时检查数据库中是否存在具有相同电子邮件的用户对象。。。但我认为这不是一个好办法

    那么如何处理这种情况呢

    编辑:我正在使用的代码

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

    如果您的失败监听器被触发,那么您应该记录它提供的异常,以找出哪里出了问题。请编辑该问题,以包含其错误消息以及您正在使用的代码。问题不是错误,我故意在适当的时间关闭了internet连接,以模拟任何用户可能发生的错误。问题是发生这种情况时如何处理。(我还感到惊讶的是,OnSuccess和OnFailure都是为同一个任务调用的)
    I/System.out: onFailure: A network error (such as timeout, interrupted connection or unreachable host) has occurred.