【发布时间】: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