允许未经身份验证的用户写入 Firestore

时间:2021-03-14 15:56:09

标签: firebase google-cloud-firestore

我正在构建一个联系表单,我知道一种快速的方法是将数据写入 firestore,然后使用 trigger e-mail 扩展程序来触发电子邮件。

我已经设置了联系表单页面,并在输入验证后将字段发送到 Firestore:

let db = firebase.firestore();
db.collection("users").add({
    name: getInputVal('name'),
    email: getInputVal('email'),
    phone: getInputVal('phone'),
    message: getInputVal('message')
})
.then((docRef) => {
    console.log("Document written with ID: ", docRef.id);
})
.catch((error) => {
    console.error("Error adding document: ", error);
});

我仅将 Firestore 用于消息(其他所有内容都保存在实时数据库中,我已经设法在其中创建了足够的安全规则)。我的权限好像有问题?

我想设置什么:

  1. 允许未经身份验证的用户写入 Firestore messages 集合
  2. 仅允许管理员用户阅读/删除消息
  3. 在 db 级别设置验证,即任何字段的长度都不会超过 200 个字符,并且只能使用 String 类型

我尝试遵循实时数据库中的逻辑,并有以下规则:

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
    match /messages/{message}{
        allow write: if true
        allow read: if "request.auth.uid === 'my_user_id'"
    }
}
}

但是,每次尝试运行上面的代码时,我最终都会遇到错误 FirebaseError: Missing or insufficient permissions.

1 个答案:

答案 0 :(得分:1)

以下应该可以解决问题:

rules_version = '2';
service cloud.firestore {
   match /databases/{database}/documents {
       match /users/{user}{
         allow create: if true;
         allow read, delete: if request.auth.uid === 'my_user_id';
       }
   }
}

请注意,您不应在 request.auth.uid == 'my_user_id'; 周围加上引号

另请注意,您应该使用更多的 granular operations,即 createdelete


对于“任何字段的长度不超过 200 个字符并且只能使用一种字符串类型”的要求,您需要对每个字段执行以下操作:

allow create: if request.resource.data.field1.size() < 200 && request.resource.data.field2.size() < 200;