如何构建Firebase实时数据库规则以允许向非用户发送“邀请”URL以允许访问受保护的用户数据结构?

时间:2017-06-08 06:47:33

标签: firebase firebase-realtime-database firebase-security

/rooms/room1处考虑以下受保护的“会议室”数据结构:

数据:

{
  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 个答案:

答案 0 :(得分:1)

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

  1. 允许用户在/users/$uid/处写入自己的私人沙箱(以便他们可以在/users/$uid/activeInviteToken中设置值)
  2. 展开会议室规则,以便用户在/rooms/$room/ /users/$uid/activeInviteToken成为/rooms/$room/inviteTokens/
  3. 的孩子时,可以写信至/rooms/room1/inviteTokens/

    工作流程将是:

    1. UserA向/rooms/room1/inviteTokens/inviteToken1添加新密钥(假设为/users/UidOfUserC/activeInviteToken
    2. UserA生成一个带有邀请令牌和房间名称的链接,并将其发送给他们的朋友;例如http://example.com/?roomId=room1&inviteToken=inviteToken1
    3. 在UserC注册后,他们将inviteToken写入/rooms/room1/authorizedUsers/UidOfUserC =“inviteToken1”
    4. 最后,他们添加/users/$uid/activeInviteToken,让自己独立于inviteToken
    5. 进行访问

      虽然不是绝对必要,但完成步骤4允许用户:

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

      然而,这似乎过于复杂,尤其是在将/rooms/room1/authorizedUsers添加到var jsonObject = angular.fromJson(yourJsonString)之前涉及angular.forEach(jsonObject.whatever, function(value, key) { console.log('key : ', key); console.log('value : ', value); }); 的两步写入。