Firebase实时数据库权限拒绝:AppAttest/DeviceCheck是否属于规则中的auth?
Firebase实时数据库规则:AppAttest/DeviceCheck与
auth的关系及规则配置 核心结论
- 规则中的
auth仅指代Firebase Authentication生成的用户身份令牌,AppAttest/DeviceCheck属于Firebase AppCheck范畴,和auth是完全独立的两个验证体系,不属于auth范畴。 - 不能直接设置
.write": "true",这会完全开放数据库写入权限,极易被恶意攻击;正确做法是通过app.check()校验AppCheck令牌的有效性。
详细解释
规则里的
auth是什么?
规则中的auth变量,是Firebase Authentication验证通过后生成的用户身份标识,仅当用户通过邮箱密码、Google登录、匿名登录等Firebase Auth方式完成身份验证时,auth才会有值。你的应用没有启用Firebase Auth,所以_authToken为nil,auth != null的规则自然返回false,导致"Permission denied"。AppAttest/DeviceCheck属于
auth范畴吗?
不属于。AppAttest/DeviceCheck是Firebase AppCheck的验证方式,作用是校验请求是否来自你的合法应用;而Firebase Auth的作用是校验请求是否来自某个特定用户。两者验证维度完全不同,所以AppCheck验证通过后,auth依然会是nil(除非同时启用了Firebase Auth)。正确的规则配置
既然你的需求是仅允许合法应用写入日志,应该用AppCheck的校验规则替代auth相关判断,配置如下:
{ "rules": { ".read": "false", ".write": "app.check() == true" } }
这个规则会检查每个写入请求是否携带有效的AppCheck令牌,只有通过AppAttest/DeviceCheck验证的请求才能写入数据库,既满足你的需求,又避免了开放权限的风险。
- 为什么不能设
.write": "true"?
直接设置为true会移除所有写入限制,任何知道数据库URL的人都能往里面写入数据,恶意攻击者很容易通过脚本批量填充垃圾数据,导致数据库资源被耗尽或数据污染。
内容的提问来源于stack exchange,提问作者Andrey Solovyov
相关产品推荐
相关产品推荐

