使用用户名作为firebase中的密钥来存储用户

时间:2017-09-11 16:04:29

标签: firebase firebase-realtime-database firebase-authentication

我想要一个用户名/密码登录系统而不是电子邮件/密码。我目前正在做的是获取用户名并在最后附加一个'@ domain.com'并在firebase上注册用户作为电子邮件/密码帐户。

在我的firebase数据库中,我将用户信息存储在'userProfiles / $ uid'下。但是,只给出用户的用户名,我需要先访问另一个节点来查找uid,然后使用它来访问用户数据。

我的问题是:在每个用户名下存储用户数据是否有任何缺点?在我的安全规则中,我可以这样做:

$username + '@domain.com' === auth.token.email

大多数时候,我可以直接访问用户的uid。但是,有一种情况我想重置用户的密码(我必须自己实现它,因为我在firebase中使用用户名作为电子邮件)而且我只能访问用户名。

1 个答案:

答案 0 :(得分:1)

更新

正如评论中所指出的,因为用户使用username + '@domain.com'进行了注册,Firebase会阻止重复的用户名,因为它不允许两个单独的用户使用同一封电子邮件注册。创建用户后,您可以将用户名写入数据库,并且不会发生任何冲突。请注意,如果允许用户更改用户名,则此问题会变得更加困难。您必须根据现有用户名检查新请求的用户名,以确定所请求的名称是否已存在。最后,请不要忘记Firebase区分大小写,因此您可能希望将所有用户名强制转换为大写/小写,并在上传之前修剪尾随空格。

我能想到的最大问题是,保护区的保证是唯一的,因此不能有任何副本。如果您按用户名存储所有内容,则必须确保用户注册时没有重复的用户名。因此,您必须创建可由未经身份验证的用户读取的数据库区域,以根据现有用户名检查请求的用户名。

您必须考虑如何在大多数时间访问数据。此外,如果您对用户数据进行非规范化(将其存储在uid和用户名下),则必须确保两个副本保持同步。存储username -> uid可能更容易,因此如果您只拥有用户名,则可以使用映射来获取用户数据。这种情况经常发生,并且额外的嵌套查询不会产生很大的性能差异。