Firebase 无法创建新文档

时间:2021-01-29 10:19:23

标签: javascript firebase google-cloud-firestore firebase-authentication

我有一个 firebase 项目,自从我上次构建以来,它不会创建新文档。它将保存和修改文档,但不会创建新文档。

创建新文档的函数应该使用基于新创建的 uid 的键创建一个新文档,如下所示:

SELECT count(*)
FROM visits
GROUP BY date_visited
ORDER BY count(*) DESC

我将 checkUserEmailExists 设置为始终返回 true。 createUser 是云中的 Firebase 函数,用于创建新用户。当这个函数被触发时,它正在重定向,然后出错。

该错误说是权限错误,但我的 firebase api 密钥没有更改,我可以修改现有记录。

我的数据库规则也没有改变并且基于令牌,但令牌仍然有效:

const sendInformationHandler = () => {
        const customerEmailCurrent = customerEmail.current.value
        const customerPassword = "password"
        if (checkUserEmailExists(customerEmailCurrent)) {
                createUser(
                    {
                        email: customerEmailCurrent,
                        password: customerPassword
                    }
                ).then(function(user) {
                    firebase
                    .firestore()
                    .collection('sessions')
                    .doc(user.data.uid).set(
                        {...context.state}
                    ).then(() => {
                        console.log("DATA SAVED SUCCESSFULLY!")
                    }).then(() => {
                        dispatch({ type: refreshContextFromCache, payload: INITIAL_CONTEXT})
                    }).then(() => {
                        push('/');
                    })
                }).catch(err => console.log("AN ERROR OCCURRED", err))
            } else {
                console.log("EMAIL ALREADY EXISTS!!!!!!")
            }
    };

在本地,在我推送之前,我在 firebase cli 中为正确的项目调用了 firebase 使用,并在本地使用 gcp 切换到正确的项目。

我的 firebaserc 就像:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.token.admin == true;
      }
    match /{document=**} {
      allow create: if request.auth.token.coach == true;
      }
    match /sessions/{userId} {
      allow read, write: if request.auth.token.customer == true && request.auth.uid == userId;
      }
  }
}

我的 firebase.json 就像:

{
  "targets": {
    "prod": {
      "hosting": {
        "prod": [
          "prod-project"
        ]
      }
    },
    "develop": {
      "hosting": {
        "prod": [
          "prod-project"
        ]
      }
    },
    "prod-project": {
      "hosting": {
        "prod": [
          "prod-project"
        ]
      }
    },
    "ammonite-testing": {
      "hosting": {
        "prod": [
          "prod-project"
        ]
      }
    }
  },
  "projects": {
    "prod": "prod-project",
    "default": "prod-project"
  }
}

这是怎么回事?如果 Firebase 权限不起作用?为什么我还能保存?为什么它在这个最新的 ci 版本中崩溃了,而不是在之前?

1 个答案:

答案 0 :(得分:1)

正如 Renaud Tarnec 提到的,你们的规则相互重叠。如 Firestore documentation 中所述,当多个规则与文档匹配时,如果任何 是真实的,则允许请求。实际上应用于 sessions 集合中的文档的规则是:

match /sessions/{userId} {
    allow read, write: if request.auth.token.admin == true or
                          request.auth.token.coach == true or
    }                     (request.auth.token.customer == true && request.auth.uid == userId)

为什么应用程序以前可以工作而现在不能工作,我们无法给出答案。可能是代码的某些部分发生了变化并使错误浮出水面,这实际上意味着某些请求满足上述安全标准之一,而其他请求则不满足。

如果您想在此级别进行调试,一个选项可能是向此函数和 Firebase 函数添加日志记录代码,以查看发送了哪些声明(admin、coach、userId 等)。

另外,编写 Firestore 安全规则时的最佳做法是完全避免规则重叠,并在可能的最细粒度级别授予访问权限。这有助于保护数据并确保根据需要限制访问,很容易错过意外的规则交互。