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

Posted

技术标签:

【中文标题】Firebase firestore 获取未经身份验证的用户文档【英文标题】:Firebase firestore get user document without authenticated 【发布时间】:2021-06-23 23:26:54 【问题描述】:

我试图用 firebase 构建一个应用程序。我不想让用户对他/她进行 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"

但上述规则仍然不匹配基于他/她的手机号码的文件。我根本不想让用户进行身份验证。这是一个简单的应用程序,数据不是问题。

任何帮助表示赞赏!!。谢谢。

【问题讨论】:

您为用户存储了哪些数据?您如何通过向您提供他们的电话号码来确保其他人无法访问他们的数据? 【参考方案1】:

目前尚不清楚您的数据库是如何设置的,也不清楚您是如何传递电话号码的,但这里有一个更简单的方法可以帮助您指导。

设置您的数据库,其中电话号码是客户的 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/<customerId> 处的客户数据。

【讨论】:

谢谢!,顺便说一句,这让我的头转向了正确的方向,但我不确定如何替换保存数据的密钥。含义 User(id:null, mobile:989898989);如何将密钥设置为手机号码? 啊!!,让我试试第一个选项,然后告诉我结果。 @EngineSense 如果您无法实现这种简单的数据结构,第三个选择是创建一个接受电话号码、查询数据库并返回记录的云函数。【参考方案2】:

要根据数据库中的其他文档评估传入请求,您可以使用 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;

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

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

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

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

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

【讨论】:

以上是关于Firebase firestore 获取未经身份验证的用户文档的主要内容,如果未能解决你的问题,请参考以下文章

在中国使用 Firebase 身份验证和 Firestore

匿名身份验证用户的这个 Firebase/Firestore 安全规则是不是安全?

将 Firebase 身份验证用户映射到 Firestore 文档

将 Firebase 身份验证与 Firestore 一起使用的正确方法是啥?

在不使用 Firebase 身份验证的情况下设置 Firestore 安全规则

Vue Firebase firebase/auth 不工作,但 firebase/firestore 工作正常。 “身份验证不是函数”