首页 文章

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

提问于
浏览
1

是否有内置方法来检查用户是否存在而不将“用户”集合暴露给未经身份验证的用户? (只读访问仍将公开整个用户集 . )以下是传统解决方案:

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

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

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

我知道从 createUserWithEmailAndPassword 返回的“ auth/email-already-in-use ”错误代码 . 但是,需要在提供密码之前执行检查 .

在我开始锤击服务之前确保它不存在;)

1 回答

  • 2

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

    usersRef.child('users').child(userId).once('value', ...
    

    此代码要求用户具有 /users/$userId 的读访问权 . 它确实 not 要求他们可以访问所有的 /users .

    如果您要创建一个顶级 emails 节点,则可以保留已使用的电子邮件 . 要检查特定电子邮件是否已被使用,所有用户需要访问 /emails/$email ,他们无需访问 /emails .

    所以:

    {
      "rules": {
        "users": {
          "$uid": {
            ".read": "auth.uid !== null"
          }
        },
        "emails": {
          "$email": {
            ".read": "auth.uid !== null"
          }
        }
      }
    }
    

    关于这些规则的重要事项是,任何试图从 /users/emails 读取的人都将被拒绝,从而阻止他们访问所有用户或电子邮件的列表 . 但是,如果有个人UID或电子邮件地址,他们可以检查是否已经声明了 .

    请注意,锤击您自己的服务也很好 . 但是,如果基本用例是安全地检查是否已经声明了特定的UID /电子邮件,那么您可以仅使用数据库 .

相关问题