You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase注册成功但Firestore未存储用户数据的解决方法

解决Firebase注册后Firestore未写入用户数据的问题

核心问题分析

你代码里的关键错误是在Firestore写入操作完成前就调用了firebaseAuth.signOut()。Firestore的写入规则要求request.auth != null且request.auth.uid == userId,但提前登出后,请求的认证上下文丢失,导致写入被规则拒绝,数据无法存入Firestore。

代码修改方案

把signOut()移到Firestore写入成功的回调里,确保数据写入完成后再登出用户:

void createAccountInFirebase(String email, String password, String name, String role) {
  changeInProgress(true);
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
  firebaseAuth.createUserWithEmailAndPassword(email, password)
    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
      @Override
      public void onComplete(@NonNull Task<AuthResult> task) {
        changeInProgress(false);
        if (task.isSuccessful()) {
          Toast.makeText(Registration.this, "Successfully created account", Toast.LENGTH_SHORT).show();
          firebaseAuth.getCurrentUser().sendEmailVerification();
          String uid = firebaseAuth.getCurrentUser().getUid();
          DocumentReference userDocumentRef = db.collection("users").document(uid);

          User user = new User(name, email, role);
          userDocumentRef.set(user)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
              @Override
              public void onSuccess(Void aVoid) {
                Toast.makeText(Registration.this, "用户信息已存入Firestore", Toast.LENGTH_SHORT).show();
                firebaseAuth.signOut(); // 移到此处,确保写入完成后再登出
                finish();
              }
            })
            .addOnFailureListener(new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                Toast.makeText(Registration.this, "Firestore写入失败: " + e.getMessage(), Toast.LENGTH_LONG).show();
                Log.e("FirestoreError", "写入失败原因", e); // 打印日志便于调试
              }
            });
          // 移除原位置的signOut()调用
        } else {
          Toast.makeText(Registration.this, task.getException().getLocalizedMessage(), Toast.LENGTH_LONG).show();
        }
      }
    });
}

额外调试建议

  • 查看Firestore规则日志:进入Firestore控制台→规则→规则日志,查看是否有写入被拒绝的记录,确认是否为认证问题导致。
  • 验证User类序列化:你的User类已包含无参构造和getter方法,符合Firestore序列化要求,这部分无需调整。
  • 确认规则有效性:当前Firestore规则逻辑合理,仅允许用户创建自己的文档,无需修改。

内容的提问来源于stack exchange,提问作者SIDRA andoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:35:55