这是用例:
任何用户都可以输入其电子邮件地址(例如,不进行身份验证),然后Firestore检查该电子邮件中是否有用户文档:
db.collection("users").where("email", "==", "USER_EMAIL")
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, " => ", doc.data())
})
})
.catch(function(error) {
console.error("Error getting documents: ", error)
});
除非请求的用户电子邮件匹配,否则我想限制读取用户文档的能力。用户在检查其电子邮件之前无需登录,因此不会进入request.auth信息。如何确保此安全?是否可以不登录?
显然,这不起作用,因为它不是写函数:
function isUserEmail() {
// doesn't work because it is a public-facing module (no auth):
return request.auth.email == resource.data.email
// doesn't work because not a write function:
return request.resource.data.email == resource.data.email
}
match /users/{userID} {
allow read: if isUserEmail()
}
是否可以传递request.resource.data或request.auth以外的参数?
答案 0 :(得分:2)
如果您尝试使用Firebase身份验证已知的用户电子邮件地址,则可以与request.auth.email进行比较。
allow read: if resource.data.email == request.auth.email;
但是您应该知道,对于任何给定的身份验证提供程序,都不保证电子邮件地址存在。使用电子邮件地址并不是限制访问文档的最佳方法。通常最好使用Firebase Auth分配的用户UID。
答案 1 :(得分:0)
正如道格·史蒂文森(Doug Stevenson)指出的那样,没有办法确保此用例的安全性。要使用auth,必须进行一些重组!