Firebase规则是用户列表的最佳做法?

时间:2017-11-06 22:46:29

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

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

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

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

我唯一能想到的就是使用类似公共信息的方式并行完整的分隔列表并保留每个人都可以在此列表中读取(而不是写入)的规则。但是我再次遇到一个问题,即如果我将它们保存在公共列表中,有人可以轻松访问我的整个用户列表(例如电子邮件)。

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

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

2 个答案:

答案 0 :(得分:2)

嘿,我不是Firebase的专业人士或附属机构。但是当我遇到同样类型的问题时,我与你分享了我的想法。

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

    编辑

    1. 您可以为用户提供一种通过用户名搜索其他人的方式(例如类似于Instagram)。在firebase中,您只需要将每个用户名与其UID相关联即可。所以人们可以通过用户名找到对方。想象一下这个在firebase中(你可以做同样的电子邮件,所以提出请求的人需要知道一封电子邮件才能获得UID而不是其他方式):

      user_names:{       alice_d:UID,       bob_ross:UID,       .... }

    2. 您可以稍后通过在查询中使用.equalTo()或通过FireStore运行更复杂的查询(我也是新手)或使用已将数据编入索引的搜索系统来搜索任何用户名而不暴露其他用户名像Algolia。

      1. 如果您的应用获得批准,Facebook会提供更多信息,例如好友列表,这样您就可以随时使用该列表来推荐被Facebook用户登录的朋友,并且您的应用已获得特权看朋友列表。

      2. 有关如何验证在Firebase功能中发出https请求的用户,请参阅here。在您的功能中,您可以进行搜索,只返回安全回到客户端。 (请记住速度可能是一个问题,除非您的功能经常运行)。为了从客户端提出请求,你可以这样做。

        _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();
        

        }

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

答案 1 :(得分:0)

如果您希望允许任何用户通过其电子邮件地址查找任何其他用户,则表示用户必须能够阅读电子邮件地址。如果您不希望他们能够阅读完整的配置文件,您需要设置一个额外的数据结构,将电子邮件地址映射到UID:

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

使用此结构,您只展示电子邮件地址。

但说实话,这仍然暴露了一些关于所有用户的信息。如今,我考虑使用Cloud Functions for Firebase实现搜索。这样,您的API就是function findUser(email): uid类型函数,只显示最少的信息。