Firestore 规则:允许使用密码访问文档
Posted
技术标签:
【中文标题】Firestore 规则:允许使用密码访问文档【英文标题】:Firestore rules: Allow access to a document using password 【发布时间】:2021-05-08 03:04:07 【问题描述】:我正在尝试在我的应用中构建一项功能,以将数据从一个用户“共享”给另一个用户。 (就像分享一个谷歌文档)。我目前正在为我的数据库使用 Firebase Firestore,但我没有设置服务器。
用户 A 和用户 B 都有 Firestore 文档。最佳情况下,用户 A 向用户 B 发送带有 URI 的空投或 iMessage 到我的应用程序中。用户 B 会收到一个对话框来接受请求。接受后,用户 A 和用户 B 都可以阅读彼此的文档。
我正在考虑编写类似 myapp://share?password=123 的 URI,但我似乎不知道如何编写 Firestore 规则来适应它。我似乎能够找到对用户进行身份验证的唯一方法是通过他们的 UID 或电子邮件,而不是通过密码或其他秘密信息。
有没有办法编写 Firestore 规则来执行此操作,或者是否有更好的方法来执行此操作?
感谢您的帮助!
【问题讨论】:
【参考方案1】:您可以通过将密码设置为文档本身(包括文档)路径中的节点来伪造这种数据流。如果您使用低等级密码,请确保文档使用唯一路径以防止密码冲突。
当用户 B 从客户端接受它时,您可以将文档中的键值更新为 'accepted' 为true
,您可以使用Security Rules 允许用户在某些条件下读取
使用规则来定位特定的读写功能
allow get: if request.resource.data.accepted == true;
allow update: if request.data.accepted == true &&
(request.resource.data.keys().hasOnly(['accepted']));
来源:
Firestore Rules: Change certain fields Firestore Rules Properties【讨论】:
【参考方案2】:最简单的方法是:
-
以秘密值命名 Firestore 文档,
只允许在您的安全规则中使用
get
,而不是list
。
假设您的密码/秘密是correcthorsebatterystaple
。这意味着该文档也被命名为correcthorsebatterystaple
。
现在如果你执行这些规则:
service cloud.firestore
match /databases/database/documents
match /document
allow get: if true;
只有知道文档 ID 的用户才能get
,所以在这种情况下,只有知道correcthorsebatterystaple
。
另请参阅 granular operations in security rules 上的 Firebase 文档。
【讨论】:
以上是关于Firestore 规则:允许使用密码访问文档的主要内容,如果未能解决你的问题,请参考以下文章
Firestore 安全规则 - 允许基于其父文档数据读取子集合