在Firebase数据库中;如果user_a
拥有他们可以访问的数据,并且想与user_b
共享这些数据,那么在特定用户之间安全共享数据的最佳实践和数据库结构是什么?
重要:user_a
没有有关user_b
帐户的任何信息,例如uid
。
详细示例:
1) user_a
有一个客户列表。
"users": {
"user_a": {
"clients": [
"clientUid",
"clientUid2"
]
}
},
"clients": {
"clientUid": {
"firstName": "John",
"lastName": "Doe"
},
"clientUid2": {
"firstName": "Joe",
"lastName": "Bloggs"
}
}
2) user_b
进行注册。 user_a
现在想与已注册的user_b
帐户共享clients
中的user_b
数据。
用另一种方式:user_a
有一个客户列表,其中一个创建了一个帐户,需要链接到user_a
已经为他们输入的信息。
这里重要的一点是,没有用户或帐户列表可以作为“朋友请求”的依据,以获取更多数据。我已经尝试过创建一个简短的唯一ID,以便用户在注册以访问其数据时可以输入该ID,但是不确定这是否是一种好的方法并且遇到了问题。
这与以前询问的“共享数据”问题有所不同,因为这两个问题是如何建立两个用户之间的链接的?不只是之前和之后。
答案 0 :(得分:4)
我知道是否有两种方法:
共享秘密可以轻松地在数据库中建模为一个一旦知道就可以读取的位置。您的简短唯一ID是此类共享机密的示例,其中user_a
“确定”该机密,然后将其发送到user_b
带外。
一个简单的流程:
user_a
单击应用程序中的“获取秘密” 按钮应用确定密码,例如correct-horse-battery-staple
和:
2a。将保密代码以及要共享的实际信息(在您的情况下为user_a
的UID写入数据库中不可查询但可读的位置)。
2b。将密码显示到user_a
。
user_a
复制代码,并通过某种其他通信机制将其发送到user_b
,例如文字,电子邮件,聊天。
user_b
单击应用程序中的输入密码按钮,然后粘贴密码。user_a
的UID。用于此的数据结构可能类似于:
"secrets": {
"correct-horse-battery-staple": "uidOfUserA"
}
使用以下规则确保安全:
{
"rules": {
"secrets": {
"$secret": {
".read": true
}
}
}
}
因此上述规则不允许任何人阅读/secrets
,因此他们无法获得所有机密的列表。但是一旦他们知道一个秘密,他们就可以在其下查找相关的数据。
另一种方法是在数据库中有一个用户列表,并允许user_b
搜索他们从user_a
知道的某些属性。一个共同的属性可能是他们的电子邮件地址或显示名称,您可以将其存储在数据库中,例如:
users: {
"uidOfUserA": {
email: "userA@domain.com",
displayName: "user A"
},
"uidOfUserB": {
email: "userB@anotherdomain.com",
displayName: "user B"
}
}
要允许用户互相搜索要花费更多的时间,例如:这将需要服务器端代码。这样做的原因是,要搜索数据集就需要您可以读取该数据集。在Firebase中,如果您可以读取数据集,则可以获取其下的所有数据。换句话说,要允许搜索用户,您需要能够阅读所有/users
,并且允许这样做会泄露太多信息。
因此,要安全地执行搜索,您需要具有以下规则:
{
"rules": {
"users": {
"$uid": {
".read": true,
".write": "auth.uid === $uid"
}
}
}
}
换句话说:任何人都可以为其知道UID的用户读取配置文件,但是每个用户只能修改自己的配置文件。
使用此功能,您可以实现一个Cloud Function,然后将电子邮件或显示名称作为输入,并在所有/users
中进行搜索。由于Cloud Functions以管理特权访问数据库,因此它们不受上述安全规则的限制。