Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flatter firebase发送令牌并读取数据库_Firebase_Flutter_Google Cloud Firestore_Firebase Security - Fatal编程技术网

Flatter firebase发送令牌并读取数据库

Flatter firebase发送令牌并读取数据库,firebase,flutter,google-cloud-firestore,firebase-security,Firebase,Flutter,Google Cloud Firestore,Firebase Security,当我尝试在firebase中阅读文档时,我希望能够检查请求是否合法。 因此,firebase中存储了一个令牌。我只想允许访问,如果令牌与客户端匹配。 因此,我的安全规则应该检查来自客户端的令牌是否与文档中的令牌匹配。 我不能用auth实现这一点,因为我的应用程序没有登录名,完全依赖文档id和令牌来访问数据 所以我的问题是,我如何在我的颤振读取请求中发送一个参数? 如果请求中的令牌与文档中的令牌匹配,我如何进行比较。 我想大概是这样的: match /databases/{database}/d

当我尝试在firebase中阅读文档时,我希望能够检查请求是否合法。 因此,firebase中存储了一个令牌。我只想允许访问,如果令牌与客户端匹配。 因此,我的安全规则应该检查来自客户端的令牌是否与文档中的令牌匹配。 我不能用auth实现这一点,因为我的应用程序没有登录名,完全依赖文档id和令牌来访问数据

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

match /databases/{database}/documents {
  match /test/{document} {
    allow write, read: if request.resource.data.token== document.data.token;
  }
}
所以我的问题是,我如何在我的颤振读取请求中发送一个参数

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

  • 发出请求的用户的名称
  • 用户试图读取的数据的名称
  • 它们传递的任何参数
因此,如果您想执行这种类型的检查,您必须将令牌编码为这三种情况之一。最简单的方法是使用令牌作为文档ID。然后将规则更改为:

match /databases/{database}/documents {
  match /test/{document} {
    allow get: if true;
  }
}
用户现在仍然可以
获取
文档,但不能再
列出
文档(
读取
获取
+
列出
相同)。这可以归结为:如果你知道文档的ID,你就可以阅读它。这是保护文档访问安全的一种非常常见的方法,被称为共享机密的一种形式

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

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

  • 发出请求的用户的名称
  • 用户试图读取的数据的名称
  • 它们传递的任何参数
因此,如果您想执行这种类型的检查,您必须将令牌编码为这三种情况之一。最简单的方法是使用令牌作为文档ID。然后将规则更改为:

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

用户现在仍然可以
获取
文档,但不能再
列出
文档(
读取
获取
+
列出
相同)。这可以归结为:如果你知道文档的ID,你就可以阅读它。这是保护文档访问安全的一种非常常见的方法,被称为共享机密的一种形式。

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