用户列表最佳实践的Firebase规则?

用户列表最佳实践的Firebase规则?,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,不知何故,我对firebase规则的理解仍然存在问题,需要你们的一些意见 假设我有一个包含所有用户的用户节点。每个用户都包含电子邮件、姓名、电话等的子节点 我的基本firebase规则现在表明,只有具有正确id的用户才能在自己的节点中编辑/写入/读取。这一切都很好。但是现在我确实遇到了类似于另一个用户搜索朋友的情况,例如,我需要在所有用户中搜索姓名或电子邮件,但是由于我的规则不允许读取用户数据,除非用户是自己数据的所有者,我不知道如何解决这个问题。我无法使用规则为每个经过身份验证的用户授予其他用

不知何故,我对firebase规则的理解仍然存在问题,需要你们的一些意见

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

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

我所能想到的唯一一件事就是并行运行一个完整的独立列表,其中包含一些类似于公共信息的内容,并保持每个人都可以在列表中阅读(而不是书写)的规则。但是我又遇到了一个问题,如果我把我的整个用户列表(比如电子邮件)都放在公共列表中,有人可能会很容易地访问到我的整个用户列表

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


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

嘿,我不是专业人士,也不是Firebase的附属机构。但是,由于我遇到了同样的问题,我与你们分享我的想法

  • 我不认为允许用户根据存储在Firebase节点中的电子邮件直接从客户端搜索其他人是完全安全的。基于用户名之类的东西进行搜索是可以的,因为它适用于您的应用程序
  • 如果您必须这样做,那么我将使用Firebase函数(您可以在其中添加另一层安全检查,也没有用户直接从数据库中读取)或引入成功查询所需的其他参数,使其成为一个两步过程。类似于一个临时的唯一id,在一段时间后过期
  • 如果您仍然想要共享电子邮件,您可以将用户的敏感信息存储在单独的节点中,并且只将您真正需要向其他人公开的信息保存在公共节点中,该节点仍然可以有一些安全规则保护这些信息不被未登录的人访问,例如,您可以通过UID映射电子邮件
  • 只是一些想法

    编辑

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

    用户名:{ 艾丽斯:UID, 鲍勃罗斯:UID, .... }

  • 您可以在查询中使用.equalTo()或通过FireStore(我也是新手)运行更复杂的查询,或使用已将数据索引为Algolia的搜索系统来搜索任何用户名,而无需公开其他用户名

  • 如果你的应用获得批准,Facebook会提供更多信息,如好友列表,因此你可以始终使用该列表来建议好友,前提是用户已通过Facebook O'auth登录,并且你的应用拥有查看好友列表的权限

  • 有关如何在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的会员。但是,由于我遇到了同样的问题,我与你们分享我的想法

  • 我不认为允许用户根据存储在Firebase节点中的电子邮件直接从客户端搜索其他人是完全安全的。基于用户名之类的东西进行搜索是可以的,因为它适用于您的应用程序
  • 如果您必须这样做,那么我将使用Firebase函数(您可以在其中添加另一层安全检查,也没有用户直接从数据库中读取)或引入成功查询所需的其他参数,使其成为一个两步过程。类似于一个临时的唯一id,在一段时间后过期
  • 如果您仍然想要共享电子邮件,您可以将用户的敏感信息存储在单独的节点中,并且只将您真正需要向其他人公开的信息保存在公共节点中,该节点仍然可以有一些安全规则保护这些信息不被未登录的人访问,例如,您可以通过UID映射电子邮件
  • 只是一些想法

    编辑

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

    用户名:{ 艾丽斯:UID, 鲍勃罗斯:UID, .... }

  • 您可以在查询中使用.equalTo()或通过FireStore(我也是新手)运行更复杂的查询,或使用已将数据索引为Algolia的搜索系统来搜索任何用户名,而无需公开其他用户名

  • 如果你的应用获得批准,Facebook会提供更多信息,如好友列表,因此你可以始终使用该列表来建议好友,前提是用户已通过Facebook O'auth登录,并且你的应用拥有查看好友列表的权限

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