我正在编写一个应用程序,允许用户提交在向其他用户显示之前进行审核的提名.这需要一些限制,到目前为止我没有成功实施安全规则:
我目前的规则如下:
{
"rules": {
"nominations": {
".read": true,
"$nominationId": {
".read": "data.child('state').val() == 'approved' || auth != null", // Only read approved nominations if not authenticated
".write": "!data.exists()", // Only allow new nominations to be created
"phone": {
".read": "auth != null" // Only allow authenticated users to read phone number
},
"state": {
".read": "auth != null", // Only allow authenticated users to read approval state
".write": "auth != null" // Only allow authenticated users to …Run Code Online (Sandbox Code Playgroud) 对于Firebase实时数据库的安全规则,公共和私有数据都可以使用如下规则存在于同一树中.
但是,在使用Firestore时,它似乎无法让我们这样做,因为我们可以检索的数据只是在集合或文档下.当公共和私人数据在同一文档中定义并获取带有收集/文档的数据时,如果我们不是所有者,我们会收到私有数据权限不足的错误.
使用RTDB时,我们可以获取'users/{userId}/publicInfo'的数据,因为我们对收集/文档一无所知.
有什么方法可以使用Firestore来实现RTDB吗?否则,我们应该分开公共/私人收藏?
// rule of Firebase Realtime Database
"users": {
"$user_id": {
".read": "auth.uid === $user_id",
".write": "auth.uid === $user_id",
"private": {
".read": "auth.uid === $user_id" // --- private data
}
"public": {
".read": "auth !== null"; // --- public data
}
}
}
// Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
match /{private=**} {
allow read, write: if request.auth == userId;
}
match /{public=**} {
allow read, write: if request.auth != null;
}
} …Run Code Online (Sandbox Code Playgroud) 我在 PHP 项目中使用 REST API 通过curl (PHP curl) 将数据发送到 Firestore DB。
\n\n我正在努力理解如何为“服务”设置身份验证规则,而通过 Google 授权建议的方法对我来说似乎太过分了。
\n\n我的数据必须可供所有人读取,但只能由我的 PHP 服务器写入。
\n\n到目前为止,我可以确保只有在发送的数据集中提供了特定代码(auth=123)时才会发生写入操作:
\n\nservice cloud.firestore {\n match /databases/{database}/documents {\n match /{document=**} {\n allow read, write: if request.resource.data.auth==123\n //request.auth.uid != null;\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n问题是,由于每个人都可以读取数据,因此很容易找到该字段(auth)并知道 123 是代码。
\n\n两者中的任何一个都可能:
\n\n发送标头(或其他未记录到数据库数据中的标头)并针对该标头而不是数据字段执行规则检查?
否则(不太优选)可能只向用户隐藏字段“auth”?
我知道选项 2 原则上是不可能的,但即使我不知道如何解决,它也可能以某种方式解决。
\n\n虽然我知道这不是最好的方法,但这足以保护我的应用程序。
\n\n编辑
\n\n可能最简单、最干净的解决方案是在 Firestore 数据库中使用一对电子邮件/密码创建一个用户,并在 PHP curl 请求中使用它
\n\n我想我需要在此之后发出一个curl请求:
\n\nhttps://firebase.google.com/docs/reference/rest/auth/#section-sign-in-email-password
\n\n然后使用第一个请求中收到的令牌作为身份验证,通过另一个 PHPcurl 发出数据上传
\n\n我觉得这是正确的道路,但是......我在第一个请求时陷入困境
\n\n 404. …Run Code Online (Sandbox Code Playgroud) rest curl firebase-security firebase-authentication google-cloud-firestore