相关疑难解决方法(0)

使用安全规则限制子/域访问

我正在编写一个应用程序,允许用户提交在向其他用户显示之前进行审核的提名.这需要一些限制,到目前为止我没有成功实施安全规则:

  1. 隐藏尚未批准的任何提名
  2. 隐藏提交中的私人字段(电话,审批状态,创建日期等)

我目前的规则如下:

{
    "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 firebase-realtime-database

49
推荐指数
2
解决办法
2万
查看次数

公共和私有字段的Firestore安全规则

对于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)

firebase google-cloud-firestore firebase-security-rules

12
推荐指数
1
解决办法
5431
查看次数

简单(和)脏的 Firestore 身份验证规则

我在 PHP 项目中使用 REST API 通过curl (PHP curl) 将数据发送到 Firestore DB。

\n\n

我正在努力理解如何为“服务”设置身份验证规则,而通过 Google 授权建议的方法对我来说似乎太过分了。

\n\n

我的数据必须可供所有人读取,但只能由我的 PHP 服务器写入。

\n\n

到目前为止,我可以确保只有在发送的数据集中提供了特定代码(auth=123)时才会发生写入操作:

\n\n
service 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是,由于每个人都可以读取数据,因此很容易找到该字段(auth)并知道 123 是代码。

\n\n

两者中的任何一个都可能:

\n\n
    \n
  1. 发送标头(或其他未记录到数据库数据中的标头)并针对该标头而不是数据字段执行规则检查?

  2. \n
  3. 否则(不太优选)可能只向用户隐藏字段“auth”?

  4. \n
\n\n

我知道选项 2 原则上是不可能的,但即使我不知道如何解决,它也可能以某种方式解决。

\n\n

虽然我知道这不是最好的方法,但这足以保护我的应用程序。

\n\n

编辑

\n\n

可能最简单、最干净的解决方案是在 Firestore 数据库中使用一对电子邮件/密码创建一个用户,并在 PHP curl 请求中使用它

\n\n

我想我需要在此之后发出一个curl请求:

\n\n

https://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

4
推荐指数
1
解决办法
1375
查看次数