【问题标题】:Is it possible to make a Firebase Realtime database node accessible to only 2 specific users?是否可以让 Firebase 实时数据库节点仅可供 2 个特定用户访问?
【发布时间】:2021-12-04 16:14:45
【问题描述】:

我正在使用 Firebase 制作聊天应用。

由于我没有订阅 Cloud Functions,所以我使用的是“聊天室”模型,如果您进入,您可以与其他人聊天。

我的模型中的聊天室只有两个人。

在数据库中,这意味着只有这两个用户可以访问这个聊天室。

这是我的 Firebase rtdb 安全文件

"chat": {
  "$chatroomid": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

这仅允许经过身份验证的用户访问聊天室内的内容。

但如果您已通过身份验证并且知道聊天室 ID,您可以作为第三人加入。

我想防止这种情况发生。

我知道直接使用 Firebase 功能无法做到这一点。有没有我可以应用的技巧?

【问题讨论】:

  • 一种方法是使用两个用户的 UID 的串联创建“$chatroomid”,并使用 rtdb 规则检查“auth.uid”是否包含在“$chatroomid”变量中。但我不知道如何进行检查。
  • 我还需要验证 UID 连接的顺序。如果 _ 是分隔符并且 UID 是“123”和“abc”,则 roomid 应该是“123_abc”,而不是相反。

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


【解决方案1】:

要允许安全访问,您需要在数据库中留出一个位置来存储有权访问给定房间 ID 的 UID。说你有这个

"room_members": {
  "chatroom1": {
    "uidOfUser1": true,
    "uidOfUser2": true
  },
  "chatroom2": {
    "uidOfUser2": true,
    "uidOfUser3": true
  }
}

通过上述结构,您可以通过以下方式保护对房间的访问:

"chat": {
  "$chatroomid": {
    ".read": "auth != null && 
              root.child('room_members').child(chatroomid).child(auth.uid).exists()",
    ...
  }
}

另请参阅:Best way to manage Chat channels in Firebase 了解有关此建模的更多信息。

【讨论】:

  • 我可以为 UID 保留一个单独的位置,但这会产生相同的问题,即授权用户将名称写入“room_members”。我认为最好的方法是按照您在链接中的建议,使用词法方式根据用户 ID 生成房间 ID。问题是,如果有人试图通过发送直接服务器请求来创建房间 ID 怎么办。这将绕过在前端进行的检查。我需要一种方法来使用数据库规则验证词法生成的房间 ID。
猜你喜欢
  • 2017-10-16
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多