Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firestore安全规则-不通过身份验证或写入(resource.data)将数据传递到Firestore_Javascript_Firebase_Google Cloud Firestore_Firebase Security - Fatal编程技术网

Javascript Firestore安全规则-不通过身份验证或写入(resource.data)将数据传递到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

以下是用例:

任何用户都可以输入他们的电子邮件地址(例如,无身份验证),然后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以外的参数?

如果您试图使用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之外传递参数?没有。那根本不安全,这是我担心的。听起来像是重组在即。谢谢