当前位置: 首页 > 知识库问答 >
问题:

Firebase:当用户注册Google提供商时,如何处理具有相同displayNames的用户?

郎子平
2023-03-14

我有一个应用程序,人们可以注册用户帐户。他们可以使用他们的谷歌帐户或使用电子邮件/密码注册。我将用户的displayName存储在Firestore中,以便我可以在整个应用程序中引用它作为他们的用户名。

但是,有一个问题:

假设“John Doe”在我的应用程序上注册了一个用户帐户,他使用名为 johndoe@gmail.com 的Google帐户。他的谷歌帐户的显示名称也是“John Doe”。然而,几天后,另一个同名“John Doe”注册了一个用户帐户,尽管他的Google帐户电子邮件可能不同(假设 johndoe2@gmail.com),但他的显示名称仍然相同。现在,我的应用程序中有 2 个用户具有相同的显示名称“John Doe”。当我尝试创建用户名路由时,这会导致问题,例如:https://myapp.com/JohnDoe 和处理用户配置文件查找。

如果有其他用户可能使用相同的显示名称,那么允许用户使用其Google帐户的推荐方法是什么?问题是我不想在URL中存储uid,因为我希望它是干净的,只有显示名称。

共有2个答案

淳于坚壁
2023-03-14

很常见的情况是,URL的后缀是一些随机数字或字母数字字符的组合,如john-doe-1等等。也就是说,您必须自己实现逻辑,可能需要使用Firebase Auth Triggers for Cloud Functions,它将在创建新用户时运行,您可以为其名称添加URL。

您还可以添加一些随机字符串,例如/users/john-doe-qwerty,并可能添加一个付费功能,允许用户设置自己的URL(如果适用于您的应用程序),即虚荣URL。

王宏扬
2023-03-14

问题是我不想在URL中存储UID,因为我只想用displayName来清理它。

它可能是干净的,只要< code>displayName中的字符数合理。在您的示例中,“John Doe”仅包含8个字符,包括名称之间的空白字符,这没问题。但是我见过太多名字大于28的例子,28是UID中的字符数。因为< code>displayName属性是在Google帐户中设置的,并且只能由用户更改,所以您还有三种解决方案。

第一种方法是创建自己的机制,在应用程序中设置特定的用户名。这些用户名可以特别由用户设置。它可以与谷歌帐户中的名称相同,也可以不相同。然而,当有人选择“JohnDoe”,而第二个用户想要设置相同的用户名时,这是不可能的,因为“JohnDoi”已经存在。因此,在设置新用户名之前,您应该始终检查该用户名是否已经存在。你可以这样做,因为这是你可以控制的。使用Firestore时,只需使用以下方法即可完成:

db.collection("users").whereEqualTo("userName", "JohnDoe");

或者当使用实时数据库时:

db.child("users").orderByChild("userName").equalTo("JohnDoe");

现在,第一个“无名氏”的侧写看起来像这样:

https://myapp.com/JohnDoe

虽然第二个可能有这样的东西:

https://myapp.com/John_Doe

看到下划线了吗?这种机制被广泛使用。Facebook、Instagram、Twitter、eBay、Reddit和其他许多网站都这样做:

https://www.facebook.com/JohnDoe/
https://www.instagram.com/JohnDoe/
https://twitter.com/JohnDoe/
https://www.ebay.com/usr/JohnDoe/
https://www.reddit.com/user/JohnDoe/

第二种是忽略用户名并仅使用来自身份验证过程的UID。在这种情况下,您的URL将如下所示:

https://myapp.com/TwentyEightCharactersLong

这并不罕见,因为其他大型应用程序都使用它:

https://www.imdb.com/user/$userId/

第三个是在 UID 和用户名之间创建组合。最好的例子是Stackoverflow:

https://stackoverflow.com/users/$userId/$userName/
//                                 ^       ^

或LinkedIn:

https://www.linkedin.com/in/$userName-$userId/
//                             ^         ^

无论您应用哪种解决方案,您都会有唯一的URL。但这取决于你选择这些解决方案中哪一个对你来说更清楚。

 类似资料:
  • 它还说在上面的代码注释,URL必须是白名单,我如何才能创建电子邮件和添加到firebase白名单链接? 我很感激你的好心帮助。 提前谢了。

  • 我已经实现了通过android应用程序添加单个用户,但不能同时注册多个用户。是否有一些java或android代码,这将允许我注册大量的用户在同一时间?

  • 我正在使用onelogin java saml对我的应用程序的用户进行身份验证。SSO部分运行良好;但是,当我使用onelogin用户管理页面强制注销用户时,我看不到向我的服务提供商SLSendpoint发出的任何请求。我是否缺少打开SLO的配置? 这是我的onelogin配置: onelogin。saml2。strict=false-onelogin。saml2。debug=true onelo

  • 所以,我只是想处理用户从应用程序注销时的情况。当用户注销时,我调用方法,它按预期工作,即用户不再收到推送消息... 但是,如果没有internet连接方法,则deleteToken()没有帮助。尽管用户已注销,但在建立连接时仍会收到推送消息。 我该怎么处理这件事?

  • 我正在阅读Symfony通过自定义用户提供商管理用户的方法:https://symfony.com/doc/current/security/custom_provider.html 当用户提交用户名和密码时,身份验证层要求配置的用户提供程序返回给定用户名的用户对象。Symfony然后检查此用户的密码是否正确,并生成安全令牌 当我们在本地使用用户/密码连接到数据库时,这非常有效,但是我想对另一个服

  • 我正在尝试创建一个应用程序,我必须注册用户,我正在使用Firebase进行注册,一旦我将所有数据放入register,然后进入Firebase数据库,我发现我自己并不是在测试模式下创建数据库的注册用户。你能解释一下我可能做错了什么吗? 注册用户代码: 我正在使用实时数据库 规则Firebase: