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 允许用户在某些条件下读取

p>

使用规则来定位特定的读写功能

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 安全规则 - 允许基于其父文档数据读取子集合

访问 Firestore 规则中的父文档字段

Firestore 安全规则,允许用户查询单个文档

我需要啥规则才能允许访问 Firestore 中的用户数据?

在 Firestore 安全规则“列表”操作中使用变量

Firebase 存储规则在 Firestore 文档上查找数据? [复制]