如何对Firebase实时数据库中的某些节点进行密码保护

如何对Firebase实时数据库中的某些节点进行密码保护,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,我正在创建一个带有Fireabse实时数据库后端的聊天室,我希望其中一些聊天室有密码保护。我有一个粗略的想法,如何可以工作,但我有困难充分充实它。假设我的结构是这样的: Chatrooms : { -randomID : { roomName: 'Chatroom 1', password: 'foobar' messages: { ... } } } 我可以为需要密码的房间设置安全结构: '

我正在创建一个带有Fireabse实时数据库后端的聊天室,我希望其中一些聊天室有密码保护。我有一个粗略的想法,如何可以工作,但我有困难充分充实它。假设我的结构是这样的:

Chatrooms : {
    -randomID : {
        roomName: 'Chatroom 1',
        password: 'foobar' 
        messages: {
          ...
        }
    }
}
我可以为需要密码的房间设置安全结构:

'Chatrooms' : {
    -randomID : {
        'roomName': 'Chatroom 1',
        'password': 'foobar',
        '.read': "data.child('validatedUsers/*user's uid*').val() === true",
        'validatedUsers' : {
            *user's uid* : true,
            *other user's uid* : true,
            ...
        }
        'messages': {
          '.read': false
          ...
        }
    }
}
通过这种方式(据我所知),我可以添加已被授予访问ValidateUsers对象权限的用户,如果他们在列表中,则顶层.read将覆盖“messages”读取


我的问题是,我无法找到一种安全的方法来获取密码,对照用户输入的内容进行检查,然后将其输入ValidateUsers对象。既然这样做不安全,那么客户端是否需要某种云函数来进行检查?现在想想,我可能需要一个云函数来散列密码?

实时数据库中没有基于密码的安全性。你必须自己实现一些东西。你走对了路,但是忘记了密码;以这种方式实现它们是不安全的,即一个用户可以简单地将密码提供给另一个用户,然后他们就可以访问。以此为例,;假设您是聊天室的主人,希望用户Bill和Ted能够访问您的聊天室。作为主机,您可以将Bill和Ted的uid添加到聊天室节点中的节点/allowed\u users:bills\u uid:true和/allowed\u users:teds\u uid:true。当Bill试图访问聊天室时,Firebase规则将验证您的聊天室/allowed_users节点中是否存在bills uid。@Jay感谢您的想法,我认为创建“请求访问”和“批准访问”是可以接受的请求将uid传递给主机,并且主机批准将其添加到列表中的功能。不过,我会保留这个选项,以防有人有创造性地使用密码,因为最初的使用案例是一个场所能够发布“房间/密码”,以便客人可以访问它,可能达到单独批准会很乏味的规模,但正如你所说的那样,这无论如何都不太安全。