You need to enable JavaScript to run this app. Firebase Firestore无法新建文档仅可修改?权限未变最新CI构建后异常
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Firestore无法新建文档仅可修改?权限未变最新CI构建后异常

问题根因定位

核心触发点:新建用户的客户端认证流程在最新CI构建中断链

出现的权限错误 不是Firebase权限校验逻辑异常,本质是客户端实际的认证状态和数据库规则的要求不匹配,完整逻辑链路:

  • 当前新建sessions文档的流程中,客户端调用createUser云函数仅完成了服务端的Auth用户创建,但没有完成客户端侧的身份登录同步:既没有用云函数返回的自定义登录令牌执行signInWithCustomToken完成身份切换,也没有等待客户端获取到新用户携带customer声明的有效身份令牌,就直接发起了Firestore写入请求。
  • 触发写入的瞬间,客户端的请求要么处于未认证状态,要么仍持有上一个会话的旧用户登录态,完全不满足规则的权限校验条件:针对sessions/{userId}路径的写入要求是request.auth.token.customer == true && request.auth.uid == 文档ID,此时客户端的request.auth.uid要么为空、要么和刚生成的新用户uid不匹配,必然触发权限拒绝。
  • 这个流程也能解释你观察到的「页面先跳转再抛报错」的现象:最新构建的前端代码把路由跳转逻辑的执行位置提前了,没有等Firestore写入的Promise完成状态确认就直接执行了push('/'),因此哪怕写入操作最终因为权限错误失败,页面也会先完成跳转,之后SDK异步抛出权限错误。

为什么可以正常修改已有文档

修改已有文档的场景和新建文档的认证状态完全隔离,不受流程断链影响:

  • 修改已有文档时,使用的是早已完成登录的老用户身份,客户端持有的身份令牌已经包含customer自定义声明,且request.auth.uid和已存在的sessions文档的id完全匹配,刚好满足第三条规则的读写要求,因此修改操作可以正常执行。

为什么问题仅在最新CI构建后出现

结合你的项目配置,两个最高概率的触发原因:

  • 前端代码的执行顺序被最新构建改动:旧版本逻辑是拿到云函数返回的自定义登录令牌、完成客户端登录并获取有效身份令牌之后,再执行Firestore写入和路由跳转;现在的代码跳过了登录步骤,提前触发路由跳转,直接发起写入,导致流程断链。
  • 云函数版本被最新CI部署更新:旧版createUser云函数会在创建完用户、设置好customer自定义声明后,生成对应的自定义登录令牌返回给前端;现在的云函数仅执行用户创建动作,不再返回可用于客户端登录的令牌,前端无法同步到新用户的有效身份。

配置层面的冗余提醒

当前的Firestore规则存在冗余设计:前两个全局通配的match /{document=**}块和第三个sessions/{userId}的路径规则是平行累加生效的,只要任意一条规则满足就会放行。目前的配置没有语法错误,但通配范围过大,后续很容易因为自定义声明配置不当出现权限泄露风险。

快速验证方式

  • 在执行Firestore写入操作前,打印firebase.auth().currentUser的状态和getIdTokenResult()返回的自定义声明内容,确认当前登录用户的uid是否和要写入的文档id一致、是否携带customer声明,即可直接定位流程断链的位置。
  • 检查createUser云函数的返回内容,确认是否仍然返回可用于客户端登录的自定义令牌。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 04:54:05