Firebase规则auth.token.email失效:模拟写入被拒绝问题排查
排查Firebase数据库规则「Simulated write denied」问题
我来帮你捋捋这个问题!你设置的规则思路是对的——只允许用户写入和自己邮箱匹配的数据,但出现「Simulated write denied」大概率是细节没处理到位,咱们逐个排查:
1. 先修正规则的JSON语法错误
你给出的规则里有个多余的逗号("c":{...},末尾的逗号),虽然部分JSON解析器会容忍,但Firebase的规则引擎可能因此解析异常,先把这个问题Fix掉:
{ "rules": { "c": { ".write": "newData.child('email').val() === auth.token.email" } } }
2. 模拟测试时的认证信息是否正确配置
这是最容易踩坑的点!很多人在规则 playground 里测试时,忘了设置匹配的认证邮箱:
- 打开规则测试面板后,切换到「Authentication」标签
- 选择「Custom」认证类型,添加
email字段,填入你要测试的邮箱(比如test@example.com) - 回到「Write」标签,设置写入路径为
/c,写入的数据必须包含email字段,且值和上面的认证邮箱完全一致(注意大小写敏感,Test@Example.com和test@example.com会被判定为不同)
3. 确认规则的作用范围是否符合你的需求
你的规则是给整个/c节点设置写入权限,这意味着:
- 任何对
/c的写入(新增或覆盖)都必须携带email字段,且和当前用户的邮箱匹配 - 如果是给
/c的子节点(比如/c/user1)写入,当前规则不会生效,你需要调整规则层级(比如把规则移到c/$userId下)
补充注意事项
auth.token.email仅在用户通过邮箱密码登录、或第三方登录(如Google)且授权了邮箱权限时才会存在;匿名登录时该字段为null,规则会直接拒绝写入- 如果你需要支持修改操作(比如只允许用户修改自己的数据),可以补充对
oldData的判断,比如:".write": "newData.child('email').val() === auth.token.email && oldData.child('email').val() === auth.token.email"
按照上面的步骤调整后,再去模拟写入应该就能正常通过了!
内容的提问来源于stack exchange,提问作者Midhilaj
相关产品推荐
相关产品推荐

