我有一个 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 版本中崩溃了,而不是在之前?
答案 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 安全规则时的最佳做法是完全避免规则重叠,并在可能的最细粒度级别授予访问权限。这有助于保护数据并确保根据需要限制访问,很容易错过意外的规则交互。