firebase - 没有用户概念的 REST 授权
问题描述
有没有办法进行某种授权,只允许最近从 Firebase 托管请求页面的人能够向 Firestore 数据库发送 HTTP POST 请求并让它通过?
我的页面基本上是一个将数据发布到 Firestore 页面的 HTML 表单,但如果至少有人必须事先与服务器交谈会很好,因为人们不必登录即可发布信息。
[编辑] 要求:
- 提供静态 HTML 表单(包括一些 Javascript)
- 仅当客户端在合理的时间范围内实际向服务器请求页面时,才应将 HTML 表单的内容发布到 firestore 数据库
- 一般来说,一些最近没有请求页面的外部代码应该无法将数据发布到数据库。这只是减轻任何“攻击”太容易的小限制。
- 没有用户或登录的概念
- 所有请求都应该通过 REST 完成,因为对于这个小项目来说,包括 Firebase SDK 太大了
解决方案
使用 Firebase 托管,没有开箱即用的日志记录机制可以检测用户之前是否请求过页面。您需要一种更“复杂”的方法。
我可以看到两种可能的方法。(可能还有其他的!)
方法 #1使用两个云函数来:
- 通过 Firebase 托管服务页面,请参阅使用 Cloud Functions 服务动态内容和托管微服务
- 在您验证用户之前请求过一个页面后,写入 Firestore。
更多细节:
对于第一部分,您实际上不会提供动态内容(我知道您计划通过托管服务静态页面),但由于此页面是通过云功能提供的,您将能够保存一个唯一的令牌(例如 Firestore 文档ID 或任何其他 UUID 值),例如 Firestore,然后发回页面内容。
然后,对于第二部分(写入 Firestore),Cloud Function 将首先检查 Firestore 数据库中是否存在具有先前生成的 doc ID 的文档,如果是,则允许写入数据库(来自云函数)。
因此,在这种情况下,两个 Cloud Functions 都需要是HTTPS 的。您可能会对这篇文章感兴趣,该文章详细介绍了通过 CF 写入 Firestore 的缺点。
方法 #2在编写之前使用 Firestore 安全规则进行检查。
- 与之前提供静态页面的解决方案相同;
- 直接写入 Firestore 并实施一个安全规则,检查是否存在具有第 1 点中保存的 doc ID 的 Firestore 文档。请参阅
exists
方法。
推荐阅读
- swift - 在 MacOS 中模拟媒体键按下
- android - ActionBar 与 TextView 重叠,ConstraintLayout 问题
- javascript - 如何允许同一个 socket.io 房间的人访问同一个 redux 商店?
- matlab - 如何在 Matlab 中同时绘制椭圆和抛物线?
- unix - 如何在特定字符串后插入换行符?
- mapreduce - CouchDB 意外的减少/减少行为
- api - 如何查询大于小于的 API
- python - 从格式化字符串中切片字符串会给出“TypeError:字符串索引必须是整数”
- doctrine-orm - 升级后与 Doctrine 的关联错误
- binary - 有没有办法将巨大的十进制数(x10^8)转换为二进制?