Android应用登录提示"用户不存在",但Firebase已注册该用户
嘿,我看你碰到了个挺闹心的问题——明明用户凭据已经成功注册到Firebase了,数据库里也能查到这个用户,结果登录的时候愣是弹出"User Does Not Exists"的提示。结合你给出的代码片段,我整理了几个最可能的原因和对应的解决办法,咱一步步来排查:
1. 注册逻辑只操作了实时数据库,没关联Firebase Authentication
你当前的代码里只初始化了FirebaseDatabase和DatabaseReference,但Firebase的用户身份验证是靠Firebase Authentication模块实现的,不是直接往实时数据库存数据就算注册成功。如果注册时只是把用户信息存进了数据库,却没调用Firebase Auth的创建用户接口,那登录时用Auth的方法自然找不到这个用户。
修复方案:
- 先确认你的项目已经集成了Firebase Authentication(添加依赖、配置好google-services.json)
- 注册用户时,要先调用Firebase Auth的创建方法,成功后再把额外数据存到实时数据库。比如用手机号+密码登录的场景:
// 初始化Firebase Auth FirebaseAuth mAuth = FirebaseAuth.getInstance(); // 先创建Auth用户 mAuth.createUserWithEmailAndPassword(yourEmail, yourPassword) .addOnCompleteListener(this, task -> { if (task.isSuccessful()) { // Auth创建成功后,再把用户的手机号等信息存到实时数据库 String userId = mAuth.getCurrentUser().getUid(); User user = new User(edtPhone.getText().toString().trim(), yourPassword); db.getReference("Users").child(userId).setValue(user); Toast.makeText(SignIn.this, "注册成功", Toast.LENGTH_SHORT).show(); } else { // 处理注册失败的情况,比如密码太短、邮箱已存在等 Toast.makeText(SignIn.this, "注册失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } });
2. 登录时的查询条件和注册数据不匹配
如果你的登录逻辑是直接查询实时数据库(而非用Firebase Auth),那大概率是查询的字段和注册时存入的字段对不上,比如:
- 注册时存的字段名是
phoneNumber,但登录时查的是phone - 手机号格式不一致(比如注册时带国家码
+86,登录时没加,或者输入的时候多了空格)
修复方案:
检查你的登录查询代码,确保字段名、数据格式完全一致。比如登录时的查询应该这么写:
// 获取输入的手机号和密码,记得trim()去掉前后空格 String inputPhone = edtPhone.getText().toString().trim(); String inputPassword = edtPassword.getText().toString().trim(); // 查询数据库中匹配的用户 users.orderByChild("phone").equalTo(inputPhone) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { // 用户存在,接下来验证密码 for (DataSnapshot ds : snapshot.getChildren()) { User user = ds.getValue(User.class); if (user != null && user.getPassword().equals(inputPassword)) { // 密码正确,完成登录逻辑 Toast.makeText(SignIn.this, "登录成功", Toast.LENGTH_SHORT).show(); } else { // 密码错误,别搞错提示 Toast.makeText(SignIn.this, "密码不正确", Toast.LENGTH_SHORT).show(); } } } else { // 确实没有匹配的用户,才提示"User Does Not Exists" Toast.makeText(SignIn.this, "User Does Not Exists", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理查询失败的情况 Toast.makeText(SignIn.this, "查询失败:" + error.getMessage(), Toast.LENGTH_SHORT).show(); } });
3. 实时数据库的权限设置导致查询失败
如果你的数据库规则是默认的read: auth != null,但登录时还没完成Firebase Auth的验证就去查询数据库,会被拒绝访问,结果就是查询不到用户,误以为用户不存在。
修复方案:
- 如果你用的是Firebase Auth登录,一定要先完成Auth验证后再去查询数据库
- 测试阶段可以临时放宽数据库规则(上线前必须改回安全规则!):
{ "rules": { ".read": true, ".write": true } }
上线后记得设置严格的规则,比如只允许已认证用户访问自己的数据:
{ "rules": { "Users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
4. 错误提示逻辑搞混了
最后检查下你的登录代码,有没有可能是密码验证失败,但错误提示写成了"User Does Not Exists"?比如这种低级错误:
// 错误示例:密码错了却提示用户不存在 if (!user.getPassword().equals(inputPassword)) { Toast.makeText(SignIn.this, "User Does Not Exists", Toast.LENGTH_SHORT).show(); }
这种情况很容易误导人,用户明明存在,但密码错了却得到错误的提示。
修复方案:
把错误提示区分清楚,密码不对就提示"密码不正确",只有确实查不到用户的时候才提示"User Does Not Exists"。
内容的提问来源于stack exchange,提问作者Clinton 3000

