【问题标题】:com.google.firebase.FirebaseException: An internal error has occurred. [ USER_NOT_FOUND ]com.google.firebase.FirebaseException:发生内部错误。 [ USER_NOT_FOUND ]
【发布时间】:2016-10-14 12:45:09
【问题描述】:

我已经使用电子邮件和密码实现了 Firebase 身份验证,这是我的代码

mFirebaseAuth.createUserWithEmailAndPassword(edtEmail.getText().toString(), edtPassword.getText().toString()).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    FirebaseUser user = task.getResult().getUser();
                    Toast.makeText(RegisterActivity.this, "User registered successfully " + user.getEmail(), Toast.LENGTH_SHORT).show();

                    user.sendEmailVerification().addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                finish();
                                Log.e("RegisterActivity", "onComplete: " + task.getResult().toString());
                            } else
                                Log.e("RegisterActivity", "onComplete: " + task.getException().toString());
                        }
                    });
                } else {
                    Toast.makeText(RegisterActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show();
                }

            }
        });

注册成功后,我正在向用户发送确认邮件,但收到此错误。

com.google.firebase.FirebaseException: An internal error has occurred. [ USER_NOT_FOUND ]

我也在 firebase 中检查过,我的用户已注册并且在那里可用,但不知何故我无法发送确认邮件。

【问题讨论】:

  • 有时在 firebase 中创建用户需要一些额外的时间,因此当您尝试向他发送电子邮件时,您的用户可能未创建。
  • 但是在 toast 中我得到了user.getEmail(),如果没有创建用户,我也不应该得到电子邮件地址。
  • 如果将user = task.getResult().getUser() 替换为user = mFirebaseAuth.getCurrentUser(),会得到相同的结果吗?
  • @qbix 如果我使用的是mFirebaseAuth.getCurrentUser(),它会显示com.google.firebase.auth.FirebaseAuthInvalidUserException: The user's credential is no longer valid. The user must sign in again.

标签: android firebase firebase-authentication


【解决方案1】:

我使用 Firebase 9.6.1 复制并运行了您的代码。当我将一个以前从未使用过的电子邮件地址传递给createUserWithEmailAndPassword() 时,sendEmailVerification() 成功完成。当我使用之前在 Firebase 控制台中创建然后删除的用户的电子邮件地址时,我观察到您报告的失败。当您使用以前使用过的地址然后删除时,您是否看到失败?

请注意,createUserWithEmailAndPassword() 不仅会创建用户,而且如果成功,还会让用户登录。当存在现有登录用户的情况下进行创建和登录时,似乎存在 Firebase 错误与上一个用户的注销和清除缓存有关。

通过在createUserWithEmailAndPassword() 之前调用signOut(),我能够使您的代码适用于以前登录和后来删除的用户。

【讨论】:

    【解决方案2】:

    您应该使用AuthStateListener() 来查看用户何时登录,这将确保用户已成功创建并登录,然后您可以验证您的用户。

    private FirebaseAuth.AuthStateListener mAuthListener;
    
     mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
    
                 VerifyYourUserWithEmail(); 
    
    
                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };
    
    @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    }
    
    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }
    

    【讨论】:

    • 但是用户登录后验证邮件有什么用?应该是注册后发送,然后用户应该可以登录了吧?
    猜你喜欢
    • 2017-04-28
    • 2020-01-19
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2017-06-24
    • 2018-11-30
    相关资源
    最近更新 更多