Firebase firestore获取未经身份验证的用户文档
我正试图用firebase在Flatter中构建一个应用程序。我不想让用户通过firebase身份验证对其进行身份验证 我只想让他们把电话号码当作密码。这意味着他/她可以输入电话号码,无需身份验证即可查看其数据。没有电话号码,他们无法读取数据(也没有OTP) 现在我有了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
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如果无法实现简单的数据结构,第三个选项是创建一个云函数,该函数接受电话号码,查询数据库并返回记录。