Angular+Firebase/Firestore 5.0.3:Google OAuth登录后文档自动删除问题
排查Firestore用户文档自动删除的问题
结合你提供的日志和代码,我帮你梳理几个最可能的原因和排查方向:
1. 优先检查Firestore安全规则
这是文档被自动删除最常见的原因。Firestore会在写入后验证规则,如果规则不允许该文档继续存在,就会触发删除操作。
你需要确认你的安全规则是否允许持久化保存用户文档:
- 有没有给
users/{userId}路径设置正确的write或update权限?比如如果只允许create而没有允许read/update,可能会导致写入后被拒绝删除。 - 规则里是否强制要求文档包含某些字段,但你的
set操作里没有提供?比如如果规则要求request.resource.data.createdAt必须存在,但你的代码里没添加这个字段,Firestore会拒绝写入并删除已创建的文档。
举个错误规则的例子:
match /users/{userId} { allow create: if request.auth.uid == userId; allow read: if request.auth.uid == userId; // 缺少了update/write权限,导致merge操作或后续文档存在不被允许 }
正确的规则应该覆盖完整的写入权限:
match /users/{userId} { allow read, write: if request.auth.uid == userId; }
2. 检查代码中是否有重复/错误的删除逻辑
仔细排查你的代码流程:
- 有没有其他地方监听了用户登录状态或
users/{uid}文档的变化,触发了删除操作?比如某些订阅回调里不小心写了delete()方法? - 这段创建文档的代码是否被多次执行?有没有竞争条件导致一个请求创建文档,另一个请求误删?
- 检查Angular组件的生命周期,比如是否在
ngOnInit或其他钩子中重复触发了写入/删除逻辑?
3. 考虑旧版本Firestore的bug
你使用的Firestore 5.0.3是2018年的老版本,可能存在一些已知的兼容性或逻辑bug,比如merge: true参数的异常处理问题。如果前面的排查都没问题,可以尝试升级到与你的Angular版本兼容的较新Firebase版本(注意版本匹配,避免依赖冲突),再测试是否还会出现文档被删的情况。
4. 确认认证状态的稳定性
有没有可能在执行set操作时,用户的认证状态还未完全同步?比如虽然拿到了user对象,但Firestore的auth上下文还没就绪,导致写入后因权限验证失败被删除。
可以尝试将创建文档的逻辑放到authState的订阅中,确保用户完全认证后再执行:
this.auth.authState.subscribe(user => { if (user) { this.db.doc(`users/${user.uid}`).set({ uid: user.uid, email: user.email, name: user.displayName, photoUrl: user.photoURL, roles: {} }, { merge: true }); } });
如果以上排查都没有解决问题,你可以提供以下信息帮助进一步定位:
- 完整的Firestore安全规则
- 登录到创建文档的完整代码流程(比如代码所在的组件/服务、触发时机)
- 更多的Firestore日志(比如写入请求的响应日志,是否有明确的权限拒绝提示)
内容的提问来源于stack exchange,提问作者Leon Marzahn
相关产品推荐
相关产品推荐

