如何阻断Firestore REST API访问,仅允许Flutter应用内操作数据
关于能否拦截所有REST API调用、仅允许应用内部访问Firestore
不存在可以完全实现该需求的方案:Firebase官方SDK底层本身就是基于REST/gRPC协议和服务端交互,服务端没有办法精准区分请求来自你打包的应用还是用户手动构造的合法请求。
你担心的数据结构被破坏的问题,完全可以通过Firestore安全规则的字段校验能力解决,不需要拦截所有REST请求。你可以在安全规则中显式约定写入数据的必填字段、字段类型、数值范围、不可修改字段等逻辑,只要不符合规则的写入请求,不管来自SDK还是手动调用的REST API都会被直接拒绝。举个简单的规则示例:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /user_data/{uid} { allow read, write: if request.auth != null && request.auth.uid == uid; // 校验创建数据必须包含指定字段、字段类型符合要求 allow create: if request.resource.data.keys().hasAll(['username', 'create_time', 'status']) && request.resource.data.username is string && request.resource.data.status in ['active', 'inactive']; // 校验更新操作不允许修改核心字段 allow update: if request.resource.data.diff(request.resource.data).changedKeys().hasAny(['username', 'status']) == false; } } }
上述规则即可从服务端层面保障写入的数据完全符合你的结构要求。
关于Firebase API密钥默认无限制的原因
Firebase API密钥本质是项目关联标识,和传统后端用于身份鉴权的私密API密钥设计定位完全不同,它的作用只是把请求和你的Firebase项目绑定,本身不具备鉴权能力,所以官方默认设置为无限制,主要是为了降低开发者的初始接入成本,避免刚创建项目就因为密钥限制导致请求失败,提升上手体验。开发者可以在业务跑通之后,再根据实际使用场景按需添加限制。
关于是否要限制API密钥仅允许Android应用调用
如果你的应用仅面向Android端发布,非常建议做这个限制。配置之后,只有携带你指定的包名、SHA-1签名的应用才能用这个API密钥调用Firebase相关服务,可以有效避免你的API密钥被其他项目盗用产生额外的成本或者安全风险。
需要注意的是,这个限制只能拦截来自非你官方应用的请求,没办法拦截你的合法用户在自己设备上抓包获取令牌后,模拟你应用的请求进行操作,这类场景还是需要依赖安全规则做最终的权限和数据结构校验。
内容的提问来源于stack exchange,提问作者Bob

