我如何构建 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 并将其发送给朋友(不一定通过电子邮件),此设计需要扩展。

如何构建我的规则以允许这样做?

我能想到的一个可能的解决方案是:

  1. 允许用户在 /users/$uid/ 处写入他们自己的私有沙盒(以便他们可以在 /users/$uid/activeInviteToken 中设置值)
  2. 扩展房间规则,如果他们的 /users/$uid/activeInviteToken 被发现是 /rooms/$room/inviteTokens/
  3. 的 child,也允许用户写入 /rooms/$room/

工作流程将是:

  1. UserA 将新密钥添加到 /rooms/room1/inviteTokens/(假设它是 /rooms/room1/inviteTokens/inviteToken1
  2. UserA 使用邀请令牌和房间名称生成 link 并将其发送给他们的朋友;例如http://example.com/?roomId=room1&inviteToken=inviteToken1
  3. UserC注册后,将他们的inviteToken写入/users/UidOfUserC/activeInviteToken = "inviteToken1"
  4. 最后,他们添加了 /rooms/room1/authorizedUsers/UidOfUserC,使自己能够独立于 inviteToken
  5. 进行访问

虽然并非绝对必要,但完成第 4 步允许用户:

  • 将他们的 activeInviteToken 更改为其他内容,以便他们可以接受到另一个房间的邀请,而不会失去对 room1 的访问权限;和
  • 使旧的 inviteTokens 过期

然而,这似乎是 overly-complicated,尤其是 two-step 在将自己添加到 /rooms/room1/authorizedUsers 之前涉及 /users/$uid/activeInviteToken 的写法。