【问题标题】:Firebase security: find other users via emailFirebase 安全性:通过电子邮件查找其他用户
【发布时间】:2016-06-20 01:42:55
【问题描述】:

假设我们在 Firebase 中有这些数据。

usersMail
    - "example1@mail.com": "1"
    - "example2@mail.com": "2"
    - "example3@mail.com": "3"

user1 是否可以查询他自己的电子邮件列表以查找正在使用该应用程序的朋友,而无需将 usersMail 设置为可被所有用户迭代?

如果这在 Firebase 中不可行,我是否必须设置一个具有管理员帐户的服务器才能进行查询?后端的东西还是很新,所以我很感激帮助!

【问题讨论】:

  • Firebase 结构可能不是最好的,但您的要求肯定可以完成。应该是 usersMail/-Yjo0ksip094koa/example1@mail.com: true, /-Yp9490josokd9/example2@mail.com: true。这使查询变得容易,或者只是观察所有电子邮件的 usersMail 节点(-Yjo0... 是使用 childByAutoId 创建的,以生成“随机”键名)。为了保护节点,您将设置一个规则,以便只有该用户可以读取他自己的节点。话虽如此,您可能需要考虑保留对用户的引用而不是实际的电子邮件。这样,可以轻松更新电子邮件。
  • 听起来像是杰伊的回答。 ;-)
  • @Jay 谢谢,但是我不希望用户只能读取他自己的节点。例如。 user1 的手机上有 user2 的电子邮件,因此应用程序应该能够询问 usersMail 中是否存在“example2@mail.com”并获取 user2 的 UID。我希望它得到保护,这样用户 3 就无法在用户邮件中抓取所有电子邮件,如果他愿意的话。这可能吗?
  • @FrankvanPuffelen 这有点像一个答案,但我不确定我是否理解后续评论。你在问吗?一个用户已经有另一个用户的电子邮件,您想使用该电子邮件从 /users 节点查找该用户 uid?是的,您可以通过查询来做到这一点,但用户最初是如何收到其他用户的电子邮件的?什么是防止任何“有其他用户电子邮件”的用户查询它。这可能是最初获取电子邮件的方式的设计问题。
  • @Jay 是的,这正是我要问的。在场景中,user1 和 user2 可能是朋友,我希望他们能够找到彼此。没有什么可以阻止“有其他用户电子邮件”的用户查询。感谢您抽出宝贵时间:D

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


【解决方案1】:

所以问题是:Firebase 中存在两个用户,uid_0 和 uid_1,我们需要 uid_0 能够通过电子邮件搜索 uid_1。

但是,我们希望防止其他用户遍历 users 节点。

答案是否定的。这是无法做到的。要通过电子邮件在用户节点中查询另一个用户,用户必须有权访问该节点中的每个用户。

但是,可能还有另一种选择。假设 uid_1 (doug) 知道 uid_0 (bob) 想要找到他并将他添加为朋友。

users
   uid_0:
     email: bob@greatwhitenorth.com
   uid_1:
     email: doug@greatwhitenorth.com

然后是一个将用户链接在一起的节点,在这种情况下,doug 知道 bob 会寻找他,我们包含 doug 的 uid,因此当 bob 读取该节点时,它将包含在子数据中

email_finder
   doug@greatwhitenorth.com
        bob@greatwhitenorth.com: true
        uid: uid_1

和限制访问的规则

rules for email_finder node
   $email
      read: root.child('email_finder').child($email)
                .child(
                       root.child('users').child(auth.uid).child('email').val
                      )
                .val = true

如果我输入正确,

root.child('users').child(auth.uid).child('email').val

应该从用户节点检索当前用户的电子邮件,在本例中为 bob@greatwhitenorth.com,因此调用 X

然后

.child($email).child(X).val = true

确保在doug节点中email = true(存在)

然后直接观察将返回包含 uid 的节点

let thisUserRef = emailFinderRef.childByAppendingValue("doug@greatwhitenorth.com")
thisUserRef.ObserveEventOfType(.Value...... {
 //capture the aid
}

您还希望用户节点上的规则也只允许用户读取他们自己的节点。

这完全未经测试,甚至可能完全错误,但可能会给你一个可能的解决方案的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    相关资源
    最近更新 更多