Firestore安全规则-不通过auth或write(resource.data)将数据传递到Firestore

时间:2019-12-17 17:47:21

标签: 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 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以外的参数?

2 个答案:

答案 0 :(得分:2)

如果您尝试使用Firebase身份验证已知的用户电子邮件地址,则可以与request.auth.email进行比较。

allow read: if resource.data.email == request.auth.email;

但是您应该知道,对于任何给定的身份验证提供程序,都不保证电子邮件地址存在。使用电子邮件地址并不是限制访问文档的最佳方法。通常最好使用Firebase Auth分配的用户UID。

答案 1 :(得分:0)

正如道格·史蒂文森(Doug Stevenson)指出的那样,没有办法确保此用例的安全性。要使用auth,必须进行一些重组!