如何编写 Firestore 规则以匹配文档中的电子邮件字段

How write Firestore rule to match email field in document

我的 'myCollection' 文档中有一个标记为 'email' 的字段,我正在尝试编写一个 firestore 规则以允许在登录用户的电子邮件记录与记录。我将我的规则编码如下:

match /myCollection/{email} {
  allow delete : if request.auth != null && request.auth.token.email == email;
}

这不允许删除匹配的记录。建议将不胜感激,因为虽然这个问题在 Whosebug 上被问了很多次,但我看到的答案是矛盾的,其中 none 对我有用。

我正在“游乐场”中对此进行测试,如果我将 'location' 设置为 myCollection/{documents = **},规则将失败。请参阅下面的屏幕截图:

我程序中的删除代码为:

    const myCollectionCol = collection(db, 'myCollection');
    const myCollectionQuery = query(myCollectionCol, where("email", "==", email));
    const myCollectionSnapshot = await getDocs(myCollectionQuery);
    myCollectionSnapshot.forEach((doc) => {
        deleteDoc(doc.ref);
    });

您正在触发一个查询 returns 所有具有字段 email 且值等于 email 变量的文档:

query(myCollectionCol, where("email", "==", email))

但是您的规则只允许删除其*文档 ID 等于其身份验证令牌中的用户电子邮件 属性 的文档。

所以要删除唯一允许删除的文档:

import { getAuth } from "firebase/auth";

const auth = getAuth();
const user = auth.currentUser;
const myEmailAddress = user.email;

...

const myCollectionCol = collection(db, 'myCollection');

deleteDoc(doc(myCollectionCol, myEmailAddress)); 

如果您希望用户能够删除 email 有其电子邮件地址的所有文档,那就是:

match /myCollection/{doc} {
  allow delete : if request.auth != null && 
                    request.auth.token.email == resource.data.email;
                                             //  the email field in the doc
}