是否有内置方法来检查用户是否存在而不将“用户”集合暴露给未经身份验证的用户? (只读访问仍将公开整个用户集 . )以下是传统解决方案:
usersRef.child('users').child(userId).once('value', function(snapshot) {
var exists = (snapshot.val() !== null);
});
我的用例是一个包含多个步骤的注册流程 . 我想在候选人到达最后一步之前检查用户是否存在 .
我最初想到如何解决此问题的方法是创建一个Admin服务,该服务可以在限制来自各个用户的查询时返回结果(类似于内置登录逻辑如何限制多个无效重试) .
我知道从 createUserWithEmailAndPassword
返回的“ auth/email-already-in-use ”错误代码 . 但是,需要在提供密码之前执行检查 .
在我开始锤击服务之前确保它不存在;)
1 回答
为了能够检查某个节点是否存在,您必须能够读取该节点 . 如果我们专门查看您的代码:
此代码要求用户具有
/users/$userId
的读访问权 . 它确实 not 要求他们可以访问所有的/users
.如果您要创建一个顶级
emails
节点,则可以保留已使用的电子邮件 . 要检查特定电子邮件是否已被使用,所有用户需要访问/emails/$email
,他们无需访问/emails
.所以:
关于这些规则的重要事项是,任何试图从
/users
或/emails
读取的人都将被拒绝,从而阻止他们访问所有用户或电子邮件的列表 . 但是,如果有个人UID或电子邮件地址,他们可以检查是否已经声明了 .请注意,锤击您自己的服务也很好 . 但是,如果基本用例是安全地检查是否已经声明了特定的UID /电子邮件,那么您可以仅使用数据库 .