#AskFirebase:是否有内置方法可以安全检查Firebase中的电子邮件和现有的用户电子邮件?

时间:2018-10-02 17:37:17

标签: javascript firebase firebase-realtime-database angularfire2

是否存在一种内置方法来检查用户的存在,而不会将您的“用户”集合暴露给未经身份验证的用户? (只读访问仍将暴露整个用户集合。)下面是传统的解决方案:

  usersRef.child('users').child(userId).once('value', function(snapshot) {
    var exists = (snapshot.val() !== null);
  });

我的用例是一个包含多个步骤的注册流程。我想在候选人到达最后一步之前检查用户的存在。

我对如何解决此问题的最初想法是创建一个Admin服务,该服务可以在限制单个用户的查询的同时返回结果(类似于内置登录逻辑如何限制多次无效重试)。

我知道从createUserWithEmailAndPassword返回的“ 身份验证/已使用电子邮件”错误代码。但是,需要在提供密码之前进行检查。

在开始提供该服务之前,请确保它不存在;)

1 个答案:

答案 0 :(得分:2)

要能够检查某个节点是否存在,您必须能够读取该节点。如果我们专门查看您的代码:

TailerListener listener  = new ShowLinesListener();
File file = new File("C:/LogFiles/Radius-log");
System.out.println("inside main");
Tailer tailer = Tailer.create(file, listener);
Thread thread = new Thread(tailer);
thread.setDaemon(true); // optional
thread.start();

此代码要求用户具有对usersRef.child('users').child(userId).once('value', ... 的读取权限。它要求他们有权访问所有/users/$userId

与创建顶级/users节点相同,您可以在其中保留已使用的电子邮件。要检查特定的电子邮件是否已在使用中,用户所需的全部就是访问emails的权限,而不必访问/emails/$email

所以:

/emails

关于这些规则的重要之处在于,任何试图从{ "rules": { "users": { "$uid": { ".read": "auth.uid !== null" } }, "emails": { "$email": { ".read": "auth.uid !== null" } } } } /users进行读取的人都会被拒绝,从而阻止他们访问所有用户或电子邮件的列表。但是给定一个单独的UID或电子邮件地址,他们可以检查是否已声明该身份。

请注意,完善自己的服务也可以。但是,如果基本用例是安全地检查是否已经声明了特定的UID /电子邮件,则可以只使用数据库。