【问题标题】:Firebase rules for user list best practice?用户列表最佳实践的 Firebase 规则?
【发布时间】:2018-04-19 05:12:10
【问题描述】:

不知何故,我仍然对 firebase 规则有一个理解问题,需要你们提供一些意见。

假设我有一个包含所有用户的用户节点。每个用户都包含用于电子邮件、姓名、电话等内容的子节点。

我的基本 firebase 规则现在说,只有具有正确 id 的用户才能在他自己的节点中编辑/写入/读取。这一切正常。但是现在我确实遇到了另一个用户搜索朋友的情况,因此我需要在所有用户中搜索姓名或电子邮件但是因为我的规则不允许读取用户数据,除非用户是他的所有者自己的数据我不知道如何解决这个问题。我不能使用规则为每个经过身份验证的用户授予其他用户数据的读取权限,但我仍然想在其他用户数据中搜索例如电子邮件地址。这让我很困惑。

我唯一能想到的就是将一个完整的独立列表与公共信息之类的东西并行运行,并在此列表中保持每个人都可以阅读(不能写)的规则。但是我又遇到了一个问题,如果我将他们保留在公共列表中,有人可以轻松访问我的整个用户列表(例如电子邮件)。

如果有人能指出我正确的方向,我会很高兴。我不知道从哪里开始正确设置。

做这样的事情最好的方法是什么?

【问题讨论】:

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


    【解决方案1】:

    您好,我不是 Firebase 专业人士,也不是 Firebase 的附属机构。但是由于我遇到了相同类型的问题,所以我与您分享我的想法。

    1. 我不认为允许用户根据存储在 Firebase 节点中的电子邮件直接从客户端搜索其他人是完全安全的。基于诸如 userName 之类的搜索是可以的,因为它的范围仅限于您的应用程序。
    2. 如果您必须这样做,那么我会使用 Firebase 函数(您可以在其中放置另一层安全检查,也没有用户直接从数据库中读取)将其设为两步过程,或者引入所有需要传递的其他参数查询成功。类似临时唯一 ID 会在一段时间后过期。
    3. 如果您仍想共享电子邮件,您可以将用户的敏感信息存储在一个单独的节点中,并且只将您真正需要向他人公开的内容保存在一个公共节点中,该公共节点仍然可以有一些安全规则来保护它以防止他人访问例如,未登录,而您按 UID 映射电子邮件。

    只是一些想法。

    编辑

    1. 您可以为用户提供一种通过用户名搜索他人的方法(例如类似于 instagram。),在 firebase 中,您只需将每个用户名与他们的 UID 连接起来。所以人们可以通过用户名找到彼此。想象一下在 firebase 中的这种情况(您可以对电子邮件执行相同的操作,因此发出请求的人需要知道电子邮件才能获取 UID,而不是其他方式):

      用户名:{ alice_d:UID, bob_ross:UID, …… }

    您可以稍后搜索任何用户名而不会暴露其他人,只需在查询中使用 .equalTo() 或通过 FireStore 运行更复杂的查询(我也是新手)或使用已为您的数据编制索引的搜索系统像阿尔戈利亚。

    1. 如果您的应用程序获得批准,Facebook 会提供更多信息,例如朋友列表,因此您始终可以使用该列表来推荐已授予用户已通过 Facebook O'auth 登录且您的应用程序有权查看朋友的朋友列表。

    2. 请参阅here,了解如何验证用户在 Firebase 函数中发出 https 请求。在您的函数中,您可以进行搜索并仅将安全的内容返回给客户端。 (请记住,除非您的函数经常运行,否则速度可能是一个问题)。为了从客户端发出请求,您可以执行以下操作。

      _makeRequest: function() {
      this.user.getIdToken().then(function(token) {
        //token is a long string JWT token used to identify the user to a Firebase service.
      var req = new XMLHttpRequest();
      
      req.onload = function() {
      /*you return the result in your function*/
      if (JSON.parse(req.responseText).rslt === "SUCCESS") {
      
      }
      }.bind(this);
      
      req.onerror = function() {
      
      }.bind(this);
      
      /*attaching location key*/
      req.open('GET', 'https://us-central1-rest-of-function-address-found-in-
      firebase-functions', true);
      req.setRequestHeader('Authorization', 'Bearer ' + token);
      req.send();
      

      }

    您也可以通过向数据库写入一些内容并拥有一个运行 onCreate() 的函数来实现这一点,如果您需要更多关于 Firebase functions 的信息,请参阅此处。希望这可以帮助。

    【讨论】:

    • 感谢您的意见。我明白你在说什么并同意。我基本上是在寻找一种让用户像许多应用程序一样搜索他们的朋友的方法。如果没有让用户搜索姓名和/或电子邮件的选项,我怎么能做到这一点。我想到了一个外部 php,它具有在 firebase 用户节点内搜索的管理员权限。像这样,您可以最大程度地使用您的用户 ID 访问 php 脚本,如果您知道该电子邮件,则可以搜索特定的电子邮件,但您永远无法列出整个树,甚至找不到您不知道的电子邮件。
    • 如果我能提供帮助,我会很高兴。 Firebase 函数为实现这一目标提供了很好的方法。我认为按用户名搜索是最好的,因为它不是可能损害隐私的个人信息,而且您的用户也可以随时更改他们的用户名,只要它是唯一的。我将编辑我的答案。
    【解决方案2】:

    如果您想允许任何用户通过他们的电子邮件地址找到任何其他用户,这意味着用户必须能够阅读电子邮件地址。如果您不希望他们能够阅读完整的个人资料,您需要设置一个额外的数据结构,将电子邮件地址映射到 UID:

    emails: {
      "theeben@domain,com": "uid5601401",
      "puf@theotherdomain,com": "uid209103"
    }
    

    使用这种结构,您只会公开电子邮件地址。

    但老实说,这仍然暴露了所有用户的一些信息。现在,我会考虑使用 Cloud Functions for Firebase 来实现搜索。这样你的 API 就是一个 function findUser(email): uid 类型的函数,只暴露最少的信息。

    【讨论】:

    • 谢谢你,弗兰克,我想我可以像上面描述的那样使用外部 php 脚本。
    猜你喜欢
    • 2013-07-03
    • 2012-03-29
    • 2020-10-26
    • 2016-11-16
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多