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

#AskFirebase: Is there a built-in method for securely checking for and existing User e-mail in Firebase?

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

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

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

我对如何解决这个问题的最初想法是创建一个管理服务,它可以 return 结果同时限制来自单个用户的查询(类似于内置登录逻辑如何限制多个无效重试)。

我知道“auth/email-already-in-use”错误代码 return 来自 createUserWithEmailAndPassword。但需要在提供密码前进行校验

在我开始敲定服务之前确保它不存在 ;)

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

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/emails 的人都将被拒绝,因此他们无法访问所有用户或电子邮件的列表。但是给定个人 UID 或电子邮件地址,他们可以检查是否已经声明。

请注意,敲定自己的服务也很好。但是,如果基本用例是安全地检查特定的 UID/email 是否已被声明,那么您可能只使用数据库就可以了。