Firebase RTDB规则始终返回Unauthorized问题排查求助
问题根源
你的规则中$user_id节点未设置.write权限,Firebase实时数据库默认拒绝所有写入操作,除非明确配置允许。虽然子字段(如Username)配置了.write规则,但父节点的权限会优先阻止整个节点的写入,这就是POST请求返回Unauthorized的核心原因。
解决方案
调整规则,给$user_id节点添加合适的.write权限,同时保留子字段的规则限制,确保数据安全性:
{ "rules": { "Accounts": { ".read": "true", "$user_id": { // 允许创建新用户,或修改已存在且Username与路径ID一致的用户 ".write": "!data.exists() || data.child('Username').val() === $user_id", ".validate": "newData.child('Username').isString() && newData.child('Password').isString() && newData.child('Salt').isString() && newData.child('ExpirationDate').isString() && // 确保Username与路径的$user_id一致,避免数据不一致 newData.child('Username').val() === $user_id", "Username": { // 禁止修改已存在的Username,仅允许创建时写入 ".write": "!data.exists() || data.val() === newData.val()" }, "Password": { ".write": "newData.exists()" }, "Salt": { ".write": "newData.exists()" }, "ExpirationDate": { ".write": "newData.exists()", ".validate": "newData.isString()" }, "IsVerified": { ".write": "newData.exists()", ".validate": "newData.isBoolean()" }, "Domains": { ".write": "true" }, "ActiveDomain": { ".write": "true" }, "VerificationCode": { ".write": "!data.exists() || newData.exists()", ".validate": "newData.isString()" } } } } }
额外建议
- 请求方法修正:Firebase REST API中,设置指定路径的节点应使用
PUT方法,而非POST(POST用于生成自动ID的新增操作)。改用PUT请求可确保行为符合预期。 - 规则模拟器差异:模拟器可能仅验证单个字段的写入权限,而你的实际请求是写入整个节点,父节点的
.write权限缺失导致了实际请求失败,模拟器却显示有效。
内容的提问来源于stack exchange,提问作者Cory Lentz
相关产品推荐
相关产品推荐

