我正在尝试构建一个简单的Web应用程序,可以将遥测发送到Firestore。每当用户执行一个操作时,我想调用一个函数updateUserWithAction
,该函数将数据发送到Firestore,增加/actions/{uid}中的计数。这是我目前得到的:
export const updateUserWithAction = async (user, action) => {
const userDocRef = doc(db, 'actions', user.uid)
await updateDoc(userDocRef, {
action: increment(1)
});
};
这违反了我的安全规则,因为它是在客户端上运行的。然后,我尝试通过提供以下安全规则来授予客户端访问权限:
service cloud.firestore {
match /databases/{database}/documents {
match /actions/{uid} {
allow read, write: if request.auth.uid == uid;
}
这似乎不起作用,我想我必须以某种方式使用户身份验证过程(即Firebase Auth)对Firestore可见...?或者我必须在updateUserWithAction
中的某个地方传递UID吗?这对我来说没有意义,因为看起来像是恶意用户可以发送一个虚构的UID来使自己能够更新任意记录。那么:我应该如何构建我的应用程序,以安全地写入这些记录?
1条答案
按热度按时间polhcujo1#
如果用户已登录,则根本不需要“传递”任何内容。规则中的
request.auth.uid
将简单地包含它们的uid。但是我们无法看到它们在您进行查询时是否已登录,也无法看到您代码中user.uid
的值以及它是否与用户的UID匹配,因此如果没有显示这些值的特定调试详细信息,我们也无能为力。