Firebase firestore获取未经身份验证的用户文档

Firebase firestore获取未经身份验证的用户文档,firebase,flutter,google-cloud-firestore,firebase-security,Firebase,Flutter,Google Cloud Firestore,Firebase Security,我正试图用firebase在Flatter中构建一个应用程序。我不想让用户通过firebase身份验证对其进行身份验证 我只想让他们把电话号码当作密码。这意味着他/她可以输入电话号码,无需身份验证即可查看其数据。没有电话号码,他们无法读取数据(也没有OTP) 现在我有了firestore规则,所以任何持有电话号码的人都可以查看数据 function isUserRef(field) { return field in resource.data && resour

我正试图用firebase在Flatter中构建一个应用程序。我不想让用户通过firebase身份验证对其进行身份验证

我只想让他们把电话号码当作密码。这意味着他/她可以输入电话号码,无需身份验证即可查看其数据。没有电话号码,他们无法读取数据(也没有OTP)

现在我有了firestore规则,所以任何持有电话号码的人都可以查看数据

 function isUserRef(field) { 
  return field in resource.data
    && resource.data.mobile == /customers/document/$(request.resource.data.mobile)
}

match /customers/{document=**} {
  allow read : if isUserRef(request.resource.data.mobile);
}
请求资源数据包含如下内容

User{
"id" : null,
"mobile" : "7878445778"
}
但根据他/她的手机号码,上述规则仍然与文档不匹配。我根本不想让用户进行身份验证。它的应用程序很简单,数据不受关注


谢谢你的帮助!!。谢谢。

要根据数据库中的其他文档评估传入请求,您可以使用
get()
exists()
请求,它们需要完全指定的文档路径

请记住,函数可以访问在定义变量的范围内定义的变量

此功能检查名为用户电话号码的文档是否存在:

function isUser(request) { 
  let requestData = request.resource.data.mobile;
  let docExists = exists(/databases/$(database)/documents/customers/$(requestData)); 
return docExists;
function isUser(document, request) {
  let requestData = request.resource.data.mobile;
  let fieldExists = get(/databases/$(database)/documents/customers/$(document)).data.mobile == requestData;
return fieldExists;

此功能检查文档中是否有包含用户电话号码的字段:

function isUser(request) { 
  let requestData = request.resource.data.mobile;
  let docExists = exists(/databases/$(database)/documents/customers/$(requestData)); 
return docExists;
function isUser(document, request) {
  let requestData = request.resource.data.mobile;
  let fieldExists = get(/databases/$(database)/documents/customers/$(document)).data.mobile == requestData;
return fieldExists;

如您所见,此用例还需要将
文档
通配符传递给函数

使用第一个功能,您的安全规则将是:

match /customers/{document} {
  allow read : if isUser(request);
}
match /customers/{document} {
  allow read : if isUser(document, request);
}
使用第二个功能,您的安全规则将是:

match /customers/{document} {
  allow read : if isUser(request);
}
match /customers/{document} {
  allow read : if isUser(document, request);
}

现在还不清楚你的数据库是如何建立的,或者你是如何传递电话号码的,但是这里有一个简单的方法可以帮助你

将数据库设置为以电话号码为客户ID。如果不可能,请创建一个
phoneToCustomers
集合,用于将电话号码与客户进行匹配

示例1:电话号码作为客户ID 假设您的客户ID是他们的电话号码:

{
  "customers": {
    "7878445778": {...},
    "1231231234": {...}
  }
}
通过这条简单的规则,您可以完成您想要的:

match /customers/{phone} {

  // Allow anyone with the phone number to access this document
  allow get: if true;

  // Can't list all customers
  allow list: if false;
}
示例2:客户ID查找表 假设您的数据库如下所示:

{
  "customers": {
    "abc123": {...},
    "xyz987": {...}
  },
  "phoneToCustomers": {
    "7878445778": "abc123",
    "1231231234": "xyz987"
  }
}
这些规则阻止用户查询您的客户或电话号码,但如果用户知道ID,则允许检索文档

match /customers/{customerId} {

  // Allow anyone with the customer ID to access this document
  allow get: if true;

  // Can't list all customers
  allow list: if false;
}

match /phoneToCustomers/{phone} {

  // Allow anyone with the phone number to access this document
  allow get: if true;

  // Can't list all customers
  allow list: if false;
}

然后,您需要get()
/phoneToCustomers/7878445778
来获取客户ID,然后第二个get()来检索
/customers/
上的客户数据,您为用户存储了哪些数据?您如何确保其他人无法通过向您提供电话号码来访问他们的数据?谢谢!,顺便说一句,这让我的头转向了正确的方向,但我不知道如何替换保存数据的键。表示用户(id:null,mobile:989);如何将钥匙设置为手机号码?.Ahh!!,让我试试第1个选项,并告诉我结果。@Engine如果无法实现简单的数据结构,第三个选项是创建一个云函数,该函数接受电话号码,查询数据库并返回记录。