Javascript Firestore安全规则-不通过身份验证或写入(resource.data)将数据传递到Firestore
以下是用例: 任何用户都可以输入他们的电子邮件地址(例如,无身份验证),然后Firestore检查该电子邮件中是否有用户文档:Javascript Firestore安全规则-不通过身份验证或写入(resource.data)将数据传递到Firestore,javascript,firebase,google-cloud-firestore,firebase-security,Javascript,Firebase,Google Cloud Firestore,Firebase Security,以下是用例: 任何用户都可以输入他们的电子邮件地址(例如,无身份验证),然后Firestore检查该电子邮件中是否有用户文档: db.collection("users").where("email", "==", "USER_EMAIL") .get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { // doc.data() is never undefined for
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以外的参数?如果您试图使用Firebase身份验证已知的用户电子邮件地址,您可以对此进行比较
allow read: if resource.data.email == request.auth.email;
但您应该知道,对于任何给定的身份验证提供商,电子邮件地址都不能保证存在。使用电子邮件地址并不是限制访问文档的最佳方式。通常最好使用Firebase Auth分配的用户UID。如果您试图使用Firebase Authentication已知的用户电子邮件地址,您可以与之进行比较
allow read: if resource.data.email == request.auth.email;
但您应该知道,对于任何给定的身份验证提供商,电子邮件地址都不能保证存在。使用电子邮件地址并不是限制访问文档的最佳方式。一般来说,最好使用Firebase Auth分配的用户UID。正如Doug Stevenson所指出的,没有办法使这个用例安全。将不得不重新构造一点来使用auth 正如Doug Stevenson所指出的,没有办法使这个用例安全。将不得不重新构造一点来使用auth 没有进行身份验证——这是一个面向公众的模块,用户无需登录。有没有办法在request.auth和request.resource.data之外传递参数?没有。那根本不安全,这是我担心的。听起来像是重组在即。谢谢没有进行身份验证——这是一个面向公众的模块,用户无需登录。有没有办法在request.auth和request.resource.data之外传递参数?没有。那根本不安全,这是我担心的。听起来像是重组在即。谢谢