【问题标题】:com.google.firebase.auth.firebaseautInvalidUserException: there is no user corresponding to this identifiercom.google.firebase.auth.firebaseautInvalidUserException:没有与此标识符对应的用户
【发布时间】:2020-07-26 08:21:29
【问题描述】:

问题在于忘记密码重置电子邮件。我首先检查了电子邮件是否存在于firebase中,而没有编写用于发送重置邮件的代码。然后我编写了重置代码邮件,它在以无效用户异常运行应用程序时显示Toastmessage。没有这样的记录。

package com.example.loginapp;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_forgot_password);
    mAuth=FirebaseAuth.getInstance();
        forgotenteredmail=findViewById(R.id.forgotenteredmail);
    forgotnextbutton=findViewById(R.id.forgotnextbutton);
    mAuth=FirebaseAuth.getInstance();
    forgotnextbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!validateemail() )
            {
                return;
            }
            else
            {
                isUser();
                


            }

        }
    });


}

private Boolean validateemail ()
{
    String val=forgotenteredmail.getEditText().getText().toString();

    if(val.isEmpty()){
        forgotenteredmail.setError("The Field Cannot be Empty");
        return false;

    }
    else{
        forgotenteredmail.setError(null);
        forgotenteredmail.setErrorEnabled(false);
        return true;
    }
}


private  void  isUser() {
     email = forgotenteredmail.getEditText().getText().toString().trim();


    rootnode = FirebaseDatabase.getInstance();
    reference = rootnode.getReference("users");


    final Query checkuser = reference.orderByChild("email").equalTo(email);
    checkuser.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                forgotenteredmail.setError(null);
                forgotenteredmail.setErrorEnabled(false);

                resetUserPassword(email);
            } else {
                forgotenteredmail.setError("User does not Exist");
                forgotenteredmail.requestFocus();
            }
        }




        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}

public void resetUserPassword(String email){
    
    final ProgressDialog progressDialog = new ProgressDialog(forgotPassword.this);
    progressDialog.setMessage("verifying..");
    progressDialog.show();
    
    mAuth.sendPasswordResetEmail(email)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        progressDialog.dismiss();
                        Toast.makeText(getApplicationContext(), "Reset password instructions has sent to your email",
                                Toast.LENGTH_SHORT).show();
                    }else{
                        progressDialog.dismiss();
                        Toast.makeText(getApplicationContext(),
                                "Email don't exist", Toast.LENGTH_SHORT).show();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            progressDialog.dismiss();
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
        }
    });}

}

发送重置邮件时出现问题

firebase 数据库

 - **-appname**
    **-users**
            -username
                   -name:
                   -email
                   -username[enter image description here][1]
                   -passs
                   -phone
            -username
                  -name
{
  "rules": {
    ".read": true,
    ".write": true,
       "users":{
          ".indexOn":"email"
    }
  }
}

【问题讨论】:

  • 您分享的代码中的哪一行显示了确切的错误?
  • @FrankvanPuffelen 在调试时没有显示任何错误,但在运行应用程序时,检查电子邮件是否存在显示 Invalid user exception as toast 消息
  • 您可以记录它,然后将 logcat 输出中的确切消息(和任何堆栈跟踪)复制粘贴到您的问题中(下面有一个编辑链接),而不是将该消息显示为祝酒词?
  • PersistentConnection: pc_0 - 使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 '".indexOn": "email"' at users 添加到您的安全和 Firebase 数据库规则中以获得更好的性能:@FrankvanPuffelen
  • java.lang.NullPointerException: 尝试调用虚拟方法 'com.google.android.gms.tasks.Task com.google.firebase.auth.FirebaseAuth.sendPasswordResetEmail(java.lang.String)'在 com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@19.3) 的 com.example.loginapp.forgotPassword$2.onDataChange(forgotPassword.java:105) 的空对象引用上。 0:179) 在 com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.3.0:75) @FrankvanPuffelen

标签: java android firebase-realtime-database firebase-authentication


【解决方案1】:

该消息来自:

reference=rootnode.getReference("users");
final Query checkuser=reference.orderByChild("email").equalTo(email);
checkuser.addListenerForSingleValueEvent(new ValueEventListener() {
    ...

错误信息非常明确地说明了问题和解决方案:

使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 '".indexOn": "email"' at users 添加到您的安全和 Firebase 数据库规则中以获得更好的性能

要解决此问题,您需要按照indexing your data 上的文档中的说明为数据库的安全规则添加索引。

类似:

{
  "rules": {
    "users": {
      ".indexOn": "email"
    }
  }
}


更新:由于您无法使其正常工作,因此我在此 jsbin 中创建了一个示例:https://jsbin.com/kevafej/edit?js,console

节点63097781下的数据为:

{
  "users" : {
    "abc" : {
      "email" : "abc@acme.org"
    },
    "def" : {
      "email" : "def@acme.org"
    }
  }
}

相关代码:

var ref = firebase.database().ref("63097781");

ref.child('users')
  .orderByChild('email')
  .equalTo('abc@acme.org')
  .once('value')
  .then(function(results) {
    results.forEach((snapshot)=>{
      console.log(snapshot.val());
    })
  })

如果我将节点63097781 的规则设置为:

"63097781": { 
  ".read": true
}

我得到了正确的节点 ({ email: "abc@acme.org" }),但是有这个警告:

FIREBASE 警告:使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 /63097781/users 处的 ".indexOn": "email" 添加到您的安全规则中以获得更好的性能。

如果我随后将规则更改为(准确添加警告消息中所说的内容):

"63097781": { 
  ".read": true, 
  "users": { 
    ".indexOn": "email" 
  }
}

使用这些规则,我们得到相同的结果,但没有警告。

【讨论】:

  • 即使添加 indexon 后,仍然显示 message@FrankVanPuffelen
  • 这似乎出乎意料。您能否更新您的问题以显示您如何定义索引?
  • 在调试 'mAuth.sendPasswordResetEmail(email).....' 时显示了无效的用户异常,即找不到 ethe 记录...我将索引更新为 '{ "rules": {"。读”:真,“写”:真,“用户”:{“.indexOn”:“电子邮件”}}}'@FrankVanPuffelen
  • 请编辑您的问题,而不是在 cmets 中提供此信息。为此目的,它下面有一个edit 链接。
  • 我无法重现您遇到的问题,因此在我的答案中添加了一个工作示例。希望这可以帮助您找到问题,或者至少表明解决方案就是我概述的:将索引添加到 users 节点。如果你仍然有问题,你可以在你的问题的 jsbin 中设置一个类似的重现吗?这将需要你用 JavaScript 重写代码,你可以使用我的 jsbin 作为例子。
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2023-03-23
  • 2020-01-22
  • 2019-06-02
  • 2021-09-18
  • 2011-10-02
相关资源
最近更新 更多