无用户认证场景下Firebase Realtime Database安全访问方案咨询
关于自定义请求头校验方案的可行性
该方案无法实现你的需求,原因有两点:
- Firebase Realtime Database 的安全规则无法读取自定义请求头参数,无法在服务端完成校验逻辑
- Flutter Web 运行在浏览器端,所有请求参数、请求头对用户完全透明,任何人都可以通过浏览器开发者工具扒取你配置的校验参数,伪造请求绕过校验
可行实现方案
方案1:Firebase 匿名认证(推荐,改造成本最低)
该方案完全无需用户进行任何登录操作,无感知实现身份校验,满足你的需求:
- 第一步:在Firebase控制台的「身份认证」板块中开启「匿名认证」provider
- 第二步:在Flutter Web应用初始化时调用Firebase Auth SDK的
signInAnonymously()方法,该过程全程无感知,不会弹出任何授权窗口,也不需要用户提交任何信息 - 第三步:修改Realtime Database安全规则如下:
{ "rules": { ".read": "auth != null", ".write": "auth != null" } }
配置完成后,只有通过你应用内的匿名认证拿到有效token的请求才能操作数据库,外部直接发起的未携带有效认证token的请求会被直接拦截。
方案2:Firebase 云函数做中间代理层
如果不想引入任何认证相关逻辑,可以用云函数做所有数据库操作的代理:
- 第一步:修改Realtime Database安全规则,关闭所有公开读写权限:
{ "rules": { ".read": false, ".write": false } }
云函数的服务账号默认拥有数据库的读写权限,不受上述规则限制。
- 第二步:编写HTTP类型的云函数,专门处理问卷的读写请求:在云函数中先校验请求头的
Origin字段是否为你部署应用的域名,校验不通过直接返回403;校验通过后再执行对应的数据库读写操作,将结果返回给前端 - 第三步:修改Flutter Web端代码,将原本直接调用Realtime Database的逻辑改为请求上述云函数接口即可
该方案还可以额外添加请求参数校验、流量限速、垃圾内容过滤等逻辑,安全性更高。
内容的提问来源于stack exchange,提问作者Divyam Dhadwal
相关产品推荐
相关产品推荐

