【问题标题】:Firebase: approach to storing room passwordsFirebase:存储房间密码的方法
【发布时间】:2017-12-11 21:20:42
【问题描述】:

我正在使用 Firebase 和 Angular5 构建一个 Web 应用程序。我想让创建/加入私人房间成为可能(受密码保护)。

目前我正处于设计数据库的阶段,无法真正了解如何检查用户输入的正确房间密码,而无需实际从 firebase 数据库中检索它(从而使其完全不安全)。

我是否应该为此使用云功能。还是可以直接使用 firebase 完成,但我遗漏了什么?

【问题讨论】:

    标签: angular firebase angularfire2


    【解决方案1】:

    您可以在 firebase 中执行此操作。

    假设您的数据库的一部分布局如下:

    /chatRooms/$roomID/password = $PASSWORD

    /chatRooms/$roomID/password 的读/写权限已授予聊天室所有者。

    要成为聊天室的成员,您必须将文档添加到: chatRooms/$roomId/users/$userId 具有以下验证:

    条目的 userId 必须是当前用户,密码字段必须等于密码。验证规则可以访问数据库中的任何数据,即使用户无法访问数据。

    下面是一个(未经测试的)示例,将展示基本原理。

    简而言之:

    1. 只有聊天室管理员可以设置密码。没有人可以阅读。
    2. 如果用户的 uid 在成员集合中,则用户可以读取聊天数据
    3. 要将成员添加到集合中,他们必须写一个密码,等于(当时)房间密码

    代码:

    "chatrooms" : {      
      "$room_id" : {
        "chat data" : {
          ".read" : "root.child('/chattrooms/' + $room_id + '/members/' + auth.uid).exists()"
        }, 
        "password": {
          ".read": "false",
          ".write": "root.child('/chattrooms/' + $room_id).child('admin').val() == auth.uid"
        }, 
        "members" : {
          "$user_id" : {
            ".validate": "$user_id == auth.uid && newData.val() == root.child('/chattrooms/' + $room_id + '/password').val()"
          }
        }
      }
    }
    

    【讨论】:

    • 这听起来像是一个合理的解决方案。但是您能否对此进行更多解释:“条目的 userId 必须是当前用户,并且密码字段必须等于密码。验证规则可以访问数据库中的任何数据,即使用户无法访问数据。”我应该在用户输入密码时写密码吗? chatRooms/$roomId/users/$userId 我是 firebase 规则的新手。
    • > 和密码字段必须等于密码。密码字段必须等于哪个密码?我们如何在不将其实际写入数据库的情况下提供它?
    • @DaniilAndreyevichBaunov 文档在这里进行了解释。 firebase.google.com/docs/database/security 如果您阅读它们,您就会明白。用户必须尝试将自己写入/users 集合。如果他们成功了,他们一定知道密码。
    • 我已阅读文档。仍然不明白用户必须如何知道密码。我们如何检查它?我们实际上向 chatRooms/$roomId/users 位置写入了什么?只是用户 ID?
    • @DaniilAndreyevichBaunov 它已更新。现在有意义吗?
    【解决方案2】:

    一种不需要服务器的方法是将密码嵌入房间的路径中。例如:如果您有一个房间“general”和密码“correcthorsebatterystaple”,那么您可以将其建模为:

    messages
        general_correcthorsebatterystaple
    roomnames
        general
    

    并通过以下方式保护它:

    {
      rules: {
        messages: {
          "$roomid": {
            ".read": true
          }
        "roomnames: {
          ".read": true
        }
      }
    }
    

    使用这些规则,任何人都可以阅读房间名称列表。但是只有知道名字的密码才能阅读房间的消息。

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 2010-09-16
      • 2013-01-18
      • 2016-12-28
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多