【问题标题】:Firebase Database - Share Data When UID Unknown?Firebase 数据库 - 在 UID 未知时共享数据?
【发布时间】:2019-05-16 00:18:18
【问题描述】:

在 Firebase 数据库中;如果user_a 有他们可以访问的数据并且他们想与user_b 共享这些数据,那么在特定用户之间安全共享这些数据的最佳做法和数据库结构是什么?

重要提示user_a 没有任何关于 user_b 帐户的信息,例如uid.


详细示例

1) user_a 有一个客户列表。

"users": {
    "user_a": {
        "clients": [
            "clientUid",
            "clientUid2"
        ]
    }
},
"clients": {
    "clientUid": {
        "firstName": "John",
        "lastName": "Doe"
    },
    "clientUid2": {
        "firstName": "Joe",
        "lastName": "Bloggs"
    }
}

2) user_b 注册。 user_a 现在想与注册的user_b 帐户共享clients 中的user_b 数据。

换句话说:user_a 有一个客户列表,其中一个创建了一个帐户,需要链接到 user_a 已经为他们输入的信息。


这里的一个重要元素是,没有用户或帐户列表可用于“好友请求”以获取更多数据。我尝试过创建一个简短的唯一 ID,用户在注册以访问其数据时可以输入该 ID,但我不确定这是否是一个好的前进方式并且遇到了问题。

这与之前提出的“共享数据”问题不同,因为它侧重于两个用户之间的链接是如何建立的?不仅仅是之前和之后。

【问题讨论】:

    标签: database firebase firebase-realtime-database data-structures firebase-authentication


    【解决方案1】:

    我知道有两种方法:

    • 任一用户都必须知道某个值,称为共享密钥。
    • 或者您允许用户相互搜索。

    共享密钥

    共享密钥可以轻松地在数据库中建模为一个位置,一旦您知道它就可以读取它。您的简短唯一 ID 就是此类共享密钥的一个示例,其中user_a“确定”该密钥,然后将其发送到带外的user_b

    一个简单的流程:

    1. user_a 在应用程序中点击Get secret按钮
    2. 应用程序确定密码,例如correct-horse-battery-staple 和:

      2a。将密码写入数据库中不可查询但可读的位置,以及要共享的实际信息,在您的情况下为 user_a 的 UID。

      2b。向user_a显示密码。

    3. user_a 复制代码并通过其他一些通信机制将其发送给user_b,例如短信、电子邮件、聊天。

    4. user_b 点击应用中的输入密码按钮,然后粘贴密码。
    5. 应用读取位置,并能够读取user_a的UID。

    这个数据结构可能是这样的:

    "secrets": {
      "correct-horse-battery-staple": "uidOfUserA"
    }
    

    通过这些规则保护您的安全:

    {
      "rules": {
        "secrets": {
          "$secret": {
            ".read": true
          }
        }
      }
    }
    

    所以上述规则不允许任何人阅读/secrets,因此他们无法获得所有秘密的列表。但是一旦他们知道一个秘密,他们就可以在它下面查找相关的数据。

    允许搜索

    另一种方法是在您的数据库中有一个用户列表,并允许user_b 搜索他们从user_a 知道的某些属性。一个共同的属性可能是他们的电子邮件地址或他们的显示名称,您可以将其存储在数据库中,例如:

    users: {
      "uidOfUserA": {
        email: "userA@domain.com",
        displayName: "user A"
      },
      "uidOfUserB": {
        email: "userB@anotherdomain.com",
        displayName: "user B"
      }
    }
    

    允许用户相互搜索需要更多的参与,例如:它需要服务器端代码。这样做的原因是能够搜索数据集需要您可以读取该数据集。而在 Firebase 中,如果你能读取一个数据集,你就可以获得它下面的所有数据。换句话说,要允许搜索用户,您需要能够阅读所有 /users 并允许这样做会泄露太多信息。

    因此,为了安全地实施搜索,您需要有这样的规则:

    {
      "rules": {
        "users": {
          "$uid": {
            ".read": true,
            ".write": "auth.uid === $uid"
          }
        }
      }
    }
    

    简而言之:任何人都可以阅读他们知道其 UID 的用户的个人资料,但每个用户只能修改自己的个人资料。

    有了这个,您可以实现一个云函数,然后将电子邮件或显示名称作为输入,并搜索所有/users。由于 Cloud Functions 以管理权限访问数据库,因此不受上述安全规则的限制。

    【讨论】:

    • 感谢您及时详细的回答弗兰克。我需要考虑如何将“秘密”解决方案应用于我的数据库,并可能会回来对此进行澄清。我没有使用过它,但我认为 Firebase 动态链接可能在这里适用吗?
    • 你会使用动态链接做什么?
    • 我可能完全弄错了,但是否可以有效地使用它们作为一种手段,例如,在电子邮件中添加一个链接到user_b,点击后将它们带入应用程序并显示“秘密”数据。动态链接可以携带密码吗? (意识到我们在这里触及了一个全新的话题,随时阻止我。)
    • 那确实可行。这是我上面食谱中的第 3 步:在这种情况下,动态链接将是带外通信机制。
    • 创建密码时,如何确保不会重复? Firebase Cloud Functions 是否适合生成并发回自定义 uid?作为来自 .push 的标准 uid,对于手动输入(当其他自动化方法不可用时)而言,用户不友好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多