Flutter应用中使用Firestore是否必须搭配Firebase Authentication?
答案是不是强制要求,但绝大多数生产场景下强烈推荐搭配使用,具体分情况来看:
完全公开的无权限场景:如果你的Firestore数据是完全开放的(比如纯公开的资讯、静态内容),可以完全不用Firebase Authentication。这时候Firestore规则可以直接设置为:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }这种情况下确实用不到
request对象,但这种场景非常少见,而且直接开放读写权限会带来数据被篡改、恶意刷量的风险,只适合测试或完全无敏感内容的场景。需要权限控制的场景:只要你想限制特定用户才能读写数据(比如用户只能查看自己的订单、只能修改自己的资料),就必须用到Firestore规则里的
request.auth——而request.auth的数据源正是Firebase Authentication提供的用户身份信息。比如实现“用户仅能读写自己的文档”的规则:rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }这种场景下,Firebase Authentication是核心依赖,没有它的话,规则无法识别请求的发起者身份,也就没法实现有效的权限控制。
替代身份验证方案:虽然Firebase Auth是官方最适配的方案,但也可以通过自定义token实现身份验证,不过这需要你自己搭建身份校验逻辑,生成符合Firebase规范的token传给Firestore,规则里依然会用到
request.auth来验证token信息。这种方案复杂度高,仅适合有特殊定制需求的开发者,普通项目完全没必要折腾。
总结来说:如果你的Firestore不需要任何权限限制,可以不用Firebase Authentication;但只要涉及数据安全、用户隔离的需求,Firebase Authentication是最便捷、最可靠的选择,而这时候request对象(尤其是request.auth)就是规则中实现权限控制的关键。
内容的提问来源于stack exchange,提问作者sub

