我如何构建 Firebase 实时数据库规则以允许向非用户发送 "invite" URL 以允许访问受保护的用户数据结构?
How can I structure Firebase Realtime Database Rules to allow sending of "invite" URLs to non-users to allow access to protected user-data structures?
考虑 /rooms/room1
处的以下受保护 "room" 数据结构:
数据:
{
rooms: {
room1: {
content: "hello world",
authorizedUsers: {
"UidOfUserA": true,
"UidOfUserB": true
}
}
}
}
规则:
{
"rules": {
"rooms": {
"$room": {
".read": "data.child('authorizedUsers').hasChild(auth.uid)",
".write": "data.child('authorizedUsers').hasChild(auth.uid)"
}
}
}
}
目前UserA和UserB可以读写数据到/rooms/room1
。假设 UserA 能够允许 UserB 加入,因为 UserA 知道 UserB 的 UID。
但是,如果 UserA 想邀请还没有帐户的人,通过生成 URL 并将其发送给朋友(不一定通过电子邮件),此设计需要扩展。
如何构建我的规则以允许这样做?
我能想到的一个可能的解决方案是:
- 允许用户在
/users/$uid/
处写入他们自己的私有沙盒(以便他们可以在 /users/$uid/activeInviteToken
中设置值)
- 扩展房间规则,如果他们的
/users/$uid/activeInviteToken
被发现是 /rooms/$room/inviteTokens/
的 child,也允许用户写入 /rooms/$room/
工作流程将是:
- UserA 将新密钥添加到
/rooms/room1/inviteTokens/
(假设它是 /rooms/room1/inviteTokens/inviteToken1
)
- UserA 使用邀请令牌和房间名称生成 link 并将其发送给他们的朋友;例如http://example.com/?roomId=room1&inviteToken=inviteToken1
- UserC注册后,将他们的inviteToken写入
/users/UidOfUserC/activeInviteToken
= "inviteToken1"
- 最后,他们添加了
/rooms/room1/authorizedUsers/UidOfUserC
,使自己能够独立于 inviteToken 进行访问
虽然并非绝对必要,但完成第 4 步允许用户:
- 将他们的 activeInviteToken 更改为其他内容,以便他们可以接受到另一个房间的邀请,而不会失去对 room1 的访问权限;和
- 使旧的 inviteTokens 过期
然而,这似乎是 overly-complicated,尤其是 two-step 在将自己添加到 /rooms/room1/authorizedUsers
之前涉及 /users/$uid/activeInviteToken
的写法。
考虑 /rooms/room1
处的以下受保护 "room" 数据结构:
数据:
{
rooms: {
room1: {
content: "hello world",
authorizedUsers: {
"UidOfUserA": true,
"UidOfUserB": true
}
}
}
}
规则:
{
"rules": {
"rooms": {
"$room": {
".read": "data.child('authorizedUsers').hasChild(auth.uid)",
".write": "data.child('authorizedUsers').hasChild(auth.uid)"
}
}
}
}
目前UserA和UserB可以读写数据到/rooms/room1
。假设 UserA 能够允许 UserB 加入,因为 UserA 知道 UserB 的 UID。
但是,如果 UserA 想邀请还没有帐户的人,通过生成 URL 并将其发送给朋友(不一定通过电子邮件),此设计需要扩展。
如何构建我的规则以允许这样做?
我能想到的一个可能的解决方案是:
- 允许用户在
/users/$uid/
处写入他们自己的私有沙盒(以便他们可以在/users/$uid/activeInviteToken
中设置值) - 扩展房间规则,如果他们的
/users/$uid/activeInviteToken
被发现是/rooms/$room/inviteTokens/
的 child,也允许用户写入
/rooms/$room/
工作流程将是:
- UserA 将新密钥添加到
/rooms/room1/inviteTokens/
(假设它是/rooms/room1/inviteTokens/inviteToken1
) - UserA 使用邀请令牌和房间名称生成 link 并将其发送给他们的朋友;例如http://example.com/?roomId=room1&inviteToken=inviteToken1
- UserC注册后,将他们的inviteToken写入
/users/UidOfUserC/activeInviteToken
= "inviteToken1" - 最后,他们添加了
/rooms/room1/authorizedUsers/UidOfUserC
,使自己能够独立于 inviteToken 进行访问
虽然并非绝对必要,但完成第 4 步允许用户:
- 将他们的 activeInviteToken 更改为其他内容,以便他们可以接受到另一个房间的邀请,而不会失去对 room1 的访问权限;和
- 使旧的 inviteTokens 过期
然而,这似乎是 overly-complicated,尤其是 two-step 在将自己添加到 /rooms/room1/authorizedUsers
之前涉及 /users/$uid/activeInviteToken
的写法。