【问题标题】:Do I need to use userID to securely write to Firestore database?我是否需要使用 userID 来安全地写入 Firestore 数据库?
【发布时间】:2023-01-24 02:48:02
【问题描述】:

我有以下 Firestore 安全规则设置:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userID} {
        allow create;
      allow read, write: if request.auth.uid == userID;
    }
  }
}      

我试图保存用户的电子邮件,他们将其输入到我的 SwiftUI 应用程序的文本字段中,以及该应用程序生成的随机词。两者都是字符串值:

db.collection("wordOfDay").document(core.UID() ?? "").setData(["email": inputText, "word": Array(commonWords)[commonWordIndex].foreign ?? "", "date": todaysDate])

如您所见,我正在尝试使用用户首次注册时生成并保存到 UserDefaults 的用户 ID (core.UID() ?? ""),作为使用 Firestore 规则进行身份验证的方式。

但是,数据永远不会被写入。

当我让任何人访问数据库时:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

它成功写入。

我确定我遇到了身份验证问题,因为我还没有找到任何方法来向 Firestore 发送安全规则的用户 ID。

【问题讨论】:

  • 该规则规定用户必须经过身份验证并且 uid 必须匹配,您必须确保使用 FirebaseAuth 才能正常工作。让您使用基本文档中的侦听器来查看他们是否实际登录,而不是使用一些临时登录系统。文档非常详细。
  • @lorem ipsum 我正在使用 FirebaseAuth。我不认为我使用的是临时登录系统。我关注了一篇使用正确的电子邮件/密码或 Apple 登录的文章。正在使用 Core.UID,因此我可以查询 Firestore 以在我的应用程序的其他位置获取电子邮件地址。我想我可以在写入 Firestore 时使用它,以便安全规则可以对我进行身份验证。
  • 使用 UserDefaults 作为登录信息和登录状态的真实来源是权宜之计。 Firebase Auth 提供了一个监听器来处理所有这些并提供有关该主题的最新数据。 UserDefaults 也不应该用于存储敏感信息,您应该使用 Keychain 但这不是这里的问题,您的用户就像“退出”一样,所以 auth 和 uid 不匹配

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


【解决方案1】:

您最后一条规则 sn-p 中的 allow read, write: if true; 意味着世界上任何人都可以对每个文档做任何他们想做的事情,包括删除它们。那可能不是你想要的。

您的第一组规则仅允许用户在其 UID 匹配时访问文档,这是实现 owner-only access 的一个很好的示例。但是您的代码不符合此要求。特别是你叫出的表达:

core.UID() ?? ""

这表示:如果存在 core 值(大概是用户),则使用其 UID,否则使用空字符串。但是空字符串在您的代码中不是有效的文档 ID,而且您的规则无论如何也不允许这样做。

相反,您应该检查 core 是否有值,并且只有在确实有用户登录时才访问该用户的数据库文档:

if (core != null && core.UID() != null) {
  db.collection("wordOfDay").document(core.UID()!).setData(...);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2012-12-24
    • 2018-09-26
    • 1970-01-01
    • 2011-05-08
    • 2015-04-01
    • 2021-06-14
    相关资源
    最近更新 更多