我使用Stripe付款。为此,我在Firestore中有以下数据模型:
Users/{userId}/payments/{document}
每个{document}
都是一个看起来像这样的对象:
{
amount: 55
token: {...}
charge: {...}
}
用户必须能够编写token
字段(这是传递给服务器的内容),但我不希望用户能够编写charge
字段。
目前我的规则允许任何用户读取和写入此文档:
match /payments/{documents} {
allow read, write: if request.auth.uid == userId;
}
什么Firestore规则将实现我所期望的安全性?
我相信以下内容可行,它允许客户更新除收费之外的字段,以及创建没有收费字段的文档。
service cloud.firestore {
match /databases/{database}/documents {
function valid_create() {
return !(request.resource.data.keys().hasAll(["charge"]));
}
function valid_update() {
return request.resource.data.charge == resource.data.charge
|| (valid_create()
&& !(resource.data.keys().hasAll(["charge"])))
}
match /payments/{documents} {
allow read: if request.auth.uid == userId;
allow create: if request.auth.uid == userId
&& valid_create();
allow update: if request.auth.uid == userId
&& valid_update();
}
}
}