我想要一个用户名/密码登录系统,而不是电子邮件/密码。我目前正在做的是获取用户名并在末尾附加“@domain.com”,然后在 firebase 上将用户注册为电子邮件/密码帐户。
在我的 Firebase 数据库中,我将用户信息存储在“userProfiles/$uid”下。但是,如果只给出用户的用户名,我需要首先访问另一个节点来查找 uid,然后使用它来访问用户数据。
我的问题是:仅在每个用户名下存储用户数据有什么缺点吗?在我的安全规则中,我可以这样做:
$username + '@domain.com' === auth.token.email
大多数时候,我可以直接访问用户的 uid。但是,在某些情况下,我想重置用户的密码(我必须自己实现它,因为我在 firebase 中使用用户名作为电子邮件),并且我只能访问用户名。
最佳答案
更新
正如评论中所指出的,由于用户是使用用户名 + '@domain.com' 进行注册的
,Firebase 将防止重复的用户名,因为它不允许两个单独的用户使用同一个电子邮件。创建用户后,您可以将用户名写入数据库,并且不会发生任何冲突。请记住,如果允许用户更改其用户名,这个问题可能会变得更加困难。您必须对照现有用户名检查新请求的用户名,以确定请求的名称是否已存在。最后,不要忘记 Firebase 区分大小写,因此您可能需要将所有用户名转换为小写/大写,并在上传之前修剪尾部空格。
我能想到的最大问题是 Firebase 保证 uid 是唯一的,因此不能有任何重复。如果您按用户名存储所有内容,则必须确保用户注册时没有重复的用户名。因此,您必须创建一个可供未经身份验证的用户读取的数据库区域,以根据现有用户名检查请求的用户名。
大多数时候您必须考虑如何访问数据。此外,如果您对用户数据进行非规范化(将其存储在 uid 和用户名下),您必须确保两个副本保持同步。仅存储 username -> uid
可能更容易,这样如果您只有用户名,您就可以通过映射来获取用户数据。这种情况不会经常发生,而且额外的嵌套查询不会对性能产生太大影响。
关于firebase - 使用用户名作为 firebase 中的 key 来存储用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46159900/