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
相关产品推荐
相关产品推荐

