【问题标题】:Allow non-authenticated users to write into firestore允许未经身份验证的用户写入 Firestore
【发布时间】:2021-03-14 15:56:09
【问题描述】:

我正在构建一个联系表单,并了解一种快速的方法是将数据写入 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. 在数据库级别设置验证,任何字段的长度都不会超过 200 个字符,并且只能使用字符串类型

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

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.

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案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;
    

    【讨论】:

    • 看起来规则不喜欢===,必须用== 替换它。但是,我仍然收到与最初相同的输出。
    • 您尝试执行的请求是什么?
    • 不确定您的确切问题 - 我在上面显示的函数中发现了错误,在网络选项卡上我可以看到一个 POST:https://firestore.googleapis.com/google.firestore.v1.Firestore/Write/channel 编辑:在代码示例中添加了 let db = firebase.firestore();以上。
    • 哦,哇。我在代码中将users 定义为集合而不是messages。交换那个,得到了结果。非常感谢。
    • 对不起,请求是写入数据库的代码。这是问题的首要问题....我想我发现了问题:您写信给users 集合,但您的规则是针对messages 集合。我已经适应了。
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2013-05-31
    • 1970-01-01
    • 2017-07-08
    • 2020-11-21
    相关资源
    最近更新 更多