Flatter firebase发送令牌并读取数据库
当我尝试在firebase中阅读文档时,我希望能够检查请求是否合法。 因此,firebase中存储了一个令牌。我只想允许访问,如果令牌与客户端匹配。 因此,我的安全规则应该检查来自客户端的令牌是否与文档中的令牌匹配。 我不能用auth实现这一点,因为我的应用程序没有登录名,完全依赖文档id和令牌来访问数据 所以我的问题是,我如何在我的颤振读取请求中发送一个参数? 如果请求中的令牌与文档中的令牌匹配,我如何进行比较。 我想大概是这样的:Flatter firebase发送令牌并读取数据库,firebase,flutter,google-cloud-firestore,firebase-security,Firebase,Flutter,Google Cloud Firestore,Firebase Security,当我尝试在firebase中阅读文档时,我希望能够检查请求是否合法。 因此,firebase中存储了一个令牌。我只想允许访问,如果令牌与客户端匹配。 因此,我的安全规则应该检查来自客户端的令牌是否与文档中的令牌匹配。 我不能用auth实现这一点,因为我的应用程序没有登录名,完全依赖文档id和令牌来访问数据 所以我的问题是,我如何在我的颤振读取请求中发送一个参数? 如果请求中的令牌与文档中的令牌匹配,我如何进行比较。 我想大概是这样的: match /databases/{database}/d
match /databases/{database}/documents {
match /test/{document} {
allow write, read: if request.resource.data.token== document.data.token;
}
}
所以我的问题是,我如何在我的颤振读取请求中发送一个参数
您不能将自己的参数传递给安全规则。安全规则(针对读取请求)中唯一可用的信息是:
- 发出请求的用户的名称
- 用户试图读取的数据的名称
- 它们传递的任何参数
match /databases/{database}/documents {
match /test/{document} {
allow get: if true;
}
}
用户现在仍然可以获取
文档,但不能再列出
文档(读取
与获取
+列出
相同)。这可以归结为:如果你知道文档的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代码的触发器是什么?