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

如何在 Firebase 中为同一用户处理多种登录方法?

丌官哲彦
2023-03-14

我目前正在使用Firebase开发身份验证系统。我希望我的系统接受电子邮件/密码、Google和Facebook作为注册和登录方法。

到目前为止,一切都很好。当用户分别注册每种方法时,一切都很好。当一个用户想要用另一种方法注册时,问题就开始了,我需要将新方法链接到同一个用户以前使用另一种方式注册的同一个帐户。

我的示例将仅提及电子邮件/密码和Google方法。

注意:我的Firebase认证系统设置为每封电子邮件仅接受1个帐户。

例1(工作正常):

  1. 用户首次在谷歌注册
  2. 完美!我获取了他的详细信息,并使用身份验证系统创建的userID将其写入Firestore
  3. 用户尝试再次注册,现在使用他的电子邮件/密码(来自他在谷歌的第一次注册的相同电子邮件)
  4. 我收到一个错误,说电子邮件正在使用,我让用户知道他已经在谷歌注册,我要求他再次登录谷歌
  5. 然后,一旦他登录了谷歌,我就让他在他的账户页面中创建一个密码
  6. 我会取下这个密码,并将其链接到他最初注册谷歌时创建的预先存在的帐户(他目前正在登录)
  7. 太好了!现在我有一个用户可以用谷歌或他的密码登录

示例2(问题):

  1. 用户首次使用电子邮件/密码注册。请注意,他的电子邮件来自谷歌(gmail)
  2. 完美!我获取了他的详细信息,并使用身份验证系统创建的userID将其写入Firestore
  3. 用户尝试再次注册,现在使用Google登录方法(使用相同的电子邮件)
  4. 显然一切正常,用户登录也很好
  5. 但事实是,在没有任何警告的情况下,Firebase身份验证已经放弃了他的电子邮件/密码方法,只使用了Google登录方法

Google Group-Firebase Talk-关于这个问题

从上面的链接和StackOverflow上的其他一些相关问题中,我了解到这种行为是因为安全问题,这就是为什么谷歌比其他身份验证提供商有“更高的优先级”,因为你可以真正信任这些用户和他们的电子邮件。

但是删除用户创建的密码对我来说似乎是错误的。更不用说在没有任何警告的情况下这样做了。

而且,这似乎与以下Firebase帮助页面冲突:

Firebase帮助-允许多个帐户使用相同的电子邮件地址

从上面链接的帮助页面:

您可以配置用户是否可以创建使用相同电子邮件地址但链接到不同登录方法的多个帐户。例如,如果您不允许多个帐户使用相同的电子邮件地址,那么如果已经有一个帐户使用电子邮件地址ex@gmail.com和密码登录,用户就不能创建一个使用电子邮件地址ex@gmail.com的Google帐户登录的新帐户。

从上面的摘录中,我理解的是,如果我以前使用电子邮件/密码组合创建了帐户,那么我不应该使用谷歌创建帐户。但根据示例2,情况并非如此。非常奇怪!

现在真正的问题是:

由于我不能改变Firebase的行为,我正在考虑改变我的Firebase身份验证系统,允许每个电子邮件有多个帐户,并使用他们的电子邮件作为主键(而不是使用Firebase身份验证系统的用户ID)来处理Firestore中所有用户的数据,因为电子邮件/登录方法的每个组合在Firebase身份验证系统中都将被视为不同的帐户,因此每个帐户都将有不同的用户ID。

Ex:

johndoe@gmail.com / 密码 = 用户 ID X

johndoe@gmail.com/Google登录=用户ID Y

johndoe@gmail.com/Facebook登录=UserID Z

上述所有帐户都将使用 johndoe@gmail.com 作为“主密钥”(集合)在 Firestore 中存储和访问数据。

但是由于我处于开发的早期,这似乎有点“笨拙”,我将来可能会带来一些麻烦。

你推荐什么?这里的主要目标是让我的用户使用他们想要的任何方法注册和登录。所有的方法应该允许他们在我的应用程序(将在Firestore)中访问他们的数据。

我拒绝默默地删除他们之前创建的用户密码,只是为了让他们注册并使用Google。

还有其他想法或意见吗?

抱歉问了这么长时间,但我认为这很好地说明了问题。

共有1个答案

焦兴为
2023-03-14

一种选择是强制密码用户在注册后立即验证其电子邮件地址。在示例#2中,如果电子邮件地址已被验证,Firebase将保留帐户的现有密码,例如,通过向电子邮件地址发送验证链接,并且用户已单击该链接。

 类似资料:
  • 我想在使用Firebase进行身份验证的Flutter应用程序中获取登录用户的电子邮件。 我可以通过以下方式获取当前用户 但是如果我用这个去取信 我得到以下错误: 在这种情况下,如何获取登录用户的电子邮件?

  • 所以我尝试为Android Studio创建一个多级用户登录页面,我有一个基本的登录。我向数据库中添加了用户级别,但我的应用程序不断崩溃。我使用Android Studio和Firebase作为后端。 登录。班 这就是我的数据库的外观: 日志: 进程:com。实例三夏维拉拉马。希望,PID:5524 java。lang.NullPointerException:尝试调用虚拟方法“com”。谷歌。火

  • 问题内容: 我的应用程序中有Facebook登录名,并且我正在圈子里奔波,试图让需要通过注册屏幕的新用户和应该直接进入应用程序的注册用户保持平衡。这是处理Facebook登录的功能(当点击按钮并获得Facebook授权时): 在上面的方框中,我基本上说的是,一旦点击Facebook登录按钮并经过Facebook授权,如果用户具有访问令牌,则直接进入应用程序。否则,请转到注册屏幕,用户将在其中输入必

  • 瞄准 允许不同类型的用户登录到各自的接口 描述 null 每个用户通过Firebase身份验证电子邮件注册 每个用户应该能够作为每个接口访问他们各自的接口,如果不同的话 每个用户都已经与各自的子节点一起保存在Firebase数据库中。例如,在“users”下面有一个“school”,在这个“school”下面是用户类型,如“student”、“parent”和“teacher”。 可视化数据库 用

  • 问题内容: 安装组件时,我想根据用户登录的状态来呈现登录屏幕或应用程序。但是,每次刷新时,用户都会注销。我如何保持他们的登录状态? 应用组件: 这是我用来登录用户的方法(效果很好): 问题答案: 用户的令牌自动保存到本地存储中,并在加载页面时读取。这意味着,当您重新加载页面时,应该再次自动验证用户身份。 最可能的问题是您的代码未检测到此身份验证,因为构造函数在Firebase重新加载并验证用户凭据

  • 我正试图使我的网站的一部分,是限制只有那些人谁登录。 目前,我可以使用:检查它们的登录状态