【问题标题】:REST authorization with no user concept没有用户概念的 REST 授权
【发布时间】:2021-07-26 04:15:20
【问题描述】:

有没有办法进行某种授权,只允许最近从 Firebase 托管请求页面的人能够向 Firestore 数据库发送 HTTP POST 请求并让它通过?

我的页面基本上是一个将数据发布到 Firestore 页面的 HTML 表单,但如果至少有一个人必须事先与服务器交谈会更好,因为人们不必登录即可发布信息。

[编辑] 要求:

  • 提供静态 HTML 表单(包括一些 Javascript)
  • 仅当客户端在合理的时间范围内实际向服务器请求页面时,才应将 HTML 表单的内容发布到 Firestore 数据库
    • 一般来说,一些最近没有请求页面的外部代码应该无法将数据发布到数据库。这只是减轻任何“攻击”太容易的小限制。
  • 没有用户或登录的概念
  • 所有请求都应通过 REST 完成,因为包含 Firebase SDK 对于这么小的项目来说太大了

【问题讨论】:

    标签: firebase rest google-cloud-firestore firebase-hosting


    【解决方案1】:

    使用 Firebase 托管,没有开箱即用的日志记录机制可以检测用户之前是否请求过页面。您需要一种更“复杂”的方法。

    我可以看到两种可能的方法。 (可能还有其他的!)

    方法 #1 使用两个云函数:

    1. 通过 Firebase 托管服务页面,请参阅 Serve dynamic content and host microservices with Cloud Functions
    2. 在您确认用户之前请求过页面后,写入 Firestore。

    更多详情:

    对于第一部分,您实际上不会提供动态内容(我知道您计划通过 Hosting 提供静态页面),但由于此页面是通过云功能提供的,您将能够保存一个唯一的令牌(例如Firestore 文档 ID 或任何其他 UUID 值),例如 Firestore,然后发回页面内容。

    然后,对于第二部分(写入 Firestore),Cloud Function 将首先检查 Firestore 数据库中是否存在具有先前生成的 doc ID 的文档,如果是,则允许写入数据库(来自 Cloud Function)。

    因此,在这种情况下,两个 Cloud Functions 都需要为 HTTPS ones。您可能会对 article 感兴趣,它详细介绍了通过 CF 写入 Firestore 的缺点。


    方法 #2 在编写之前使用 Firestore 安全规则进行检查。

    1. 与之前的解决方案一样为静态页面提供服务;
    2. 直接写入 Firestore 并实施安全规则,以检查是否存在具有第 1 点中保存的 doc ID 的 Firestore 文档。请参阅exists 方法。

    【讨论】:

    • 有趣!在第一种方法的情况下,云函数会在请求时生成一个空文档(如果一段时间后没有任何内容,则删除)并让客户端发送应该将哪些内容写入 firestore 数据库?除了 HTML 页面本身之外,所有内容都通过云功能了吗?
    • 我知道第一步是让用户获得一个 HTML 页面(表单或任何其他页面):这个想法是通过 Cloud Function 提供这个页面,除了生成(静态)HTML,也在数据库中保存一个唯一的 ID。很难详细说明,因为我对您的详细要求没有完全清楚的看法(如果可以的话,您的问题有点模糊)。
    • 另一种可能性是保持静态页面不变(即直接由托管服务提供),但是,在此页面中,您通过 JS SDK(或 REST API)调用 Firestore ) 在数据库中保存一个唯一的 ID。这意味着您不再需要云函数,但您需要允许对特定集合进行写访问。有许多可能的变化,但您的要求不够精确,我们无法指出最好的。
    • 我在编辑后尝试详细说明要求,希望对您有所帮助。
    • 好的,很高兴你提供了更多的细节! “仅当客户端实际从服务器请求页面”是什么意思?您是指也通过托管服务提供的其他页面吗?我确认您可以通过 Firestore REST API 实现我的回答中描述的机制。
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2021-05-09
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多