【问题标题】:Flutter firebase send Token with database readFlutter firebase 发送带有数据库读取的令牌
【发布时间】:2020-08-01 06:04:25
【问题描述】:

当我尝试阅读我的 Firebase 中的文档时,我希望能够检查请求是否合法。 出于这个原因,有一个令牌存储在 Firebase 中。如果令牌与客户端匹配,我只想允许访问。 因此,我的安全规则应该检查来自客户端的令牌是否与文档中的令牌匹配。 我无法使用 auth 执行此操作,因为我的应用程序没有登录名,并且完全依赖文档 ID 和令牌来访问数据。

所以我的问题是,如何在颤振读取请求中发送参数? 如果请求中的令牌与文档中的令牌匹配,我该如何比较。 我想这大概是这样的:

match /databases/{database}/documents {
  match /test/{document} {
    allow write, read: if request.resource.data.token== document.data.token;
  }
}

【问题讨论】:

    标签: firebase flutter google-cloud-firestore firebase-security


    【解决方案1】:

    所以我的问题是,如何在颤振读取请求中发送参数?

    您不能将自己的参数传递给安全规则。安全规则中唯一可用的信息(对于读取请求)是:

    • 发出请求的用户的token
    • 用户尝试读取的数据的path
    • 它们传递的任何query 参数。

    因此,如果您想进行此类检查,则必须将令牌编码为这三件事之一。最简单的一种是使用令牌作为文档 ID。然后将您的规则更改为:

    match /databases/{database}/documents {
      match /test/{document} {
        allow get: if true;
      }
    }
    

    用户现在仍然可以get 文档,但不能再list 文档(readget + list 相同)。归结为:如果您知道文档的 ID,则可以阅读它。这是保护文档访问的一种非常常见的方法,并且被称为共享密钥的一种形式。

    【讨论】:

    • 这似乎是一个不错的解决方案,但是如果我想添加“管理员令牌”以进行写访问,该怎么办?
    • 您可以使用用户可以编写文档的逻辑,如果该文档已经存在并且他们知道其 ID。但是你的if request.resource.data.token== document.data.token; 无论如何都不会起作用,因为如果用户没有为token 指定值,resource.resource.data.tokenresource.data.token 将是相同的。这是一个常见的误解:request.resource 是允许请求后存在的资源(if 是允许的)。因此,您的检查只是确保token 字段未被修改。
    • 不,这行不通,因为我希望用户能够为不同的人分发不同的令牌。因此,如果您拥有普通令牌,您就可以看到该对象并与之交互。如果您有 admin Token,您可以删除和管理它。如果您有只读令牌,则只能读取对象中的内容。无需注册是该功能的核心功能。
    • 不幸的是,在我上面描述的内容中,您想要的似乎是不可能的。我提供了更多相关文档的链接,以便您自己检查是否可以找到一种适合产品工作方式的方法。
    • 您知道我该如何实现这样的系统吗?或者它根本不起作用?让我执行 JS 代码的触发器是什么?
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2020-05-05
    • 2021-07-14
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2020-05-29
    相关资源
    最近更新 更多