Firebase安全:通过电子邮件查找其他用户

时间:2016-06-18 13:43:20

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

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

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

无论如何,user1查询自己的电子邮件列表以查找正在使用该应用程序的朋友而不设置所有用户可以迭代的用户邮件吗?

如果在Firebase中无法做到这一点,我是否需要设置一个带有管理员帐户的服务器来进行查询?对后端的东西还是很新的所以我很感激你的帮助!

1 个答案:

答案 0 :(得分:0)

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

但是,我们希望阻止其他用户迭代用户节点。

答案是否定的。这是不可能做到的。要通过电子邮件向用户节点查询其他用户,用户必须能够访问该节点中的每个用户。

然而,可能还有另一种选择。假设uid_1(道格)知道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

确保道格节点中的email = true(存在)

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

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

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

这是完全未经测试的,甚至可能完全错误,但可能会为您提供可能的解决方案。