试图了解 Firebase 身份验证每个电子邮件地址和受信任的提供商一个帐户

Phe*_*dg1 6 oauth-2.0 firebase-authentication

Firebase项目中为每个电子邮件地址启用一个帐户进行Firebase 身份验证时,似乎有一些适用于身份验证过程的附加规则。不同的提供者似乎分为两类,受信任的和不受信任的提供者。如果用户在任何时候通过受信任的提供商登录,则该用户之前登录的所有不受信任的提供商都会从帐户中删除。此外,永远不会允许用户再次登录不受信任的提供商。提供商是否可信似乎取决于由提供商创建的新帐户是否仅通过向创建新帐户的地址发送验证电子邮件来验证该帐户。

我似乎找不到关于哪些提供商可信和不可信的完整列表。通过将解决方案实施到我的应用程序中,我发现了以下内容:

值得信赖的供应商:

  • 苹果
  • 谷歌
  • Microsoft(如果创建帐户的电子邮件是 @outlook.com 或 @hotmail.com)

不受信任的供应商:

  • Facebook
  • Microsoft(如果创建帐户的电子邮件不是 @outlook.com 或 @hotmail.com)

这种理解是否正确?我在哪里可以找到其他提供商的细分?我的应用程序是在Unity 中构建的,因此我将仅限于Firebase在 Unity 中支持的提供程序。为什么Microsoft在不同情况下既是受信任的提供商,又是不受信任的提供商?我真的可以在这里使用一些帮助。

我的应用程序适用于iOSAndroid。我想专门使用AppleGoogle登录,但iOS < 13上的用户无法使用Apple登录。这些iOS设备似乎约占西方国家所有设备的六分之一。我尝试实现GoogleMicrosoft登录以更好地覆盖这些用户,但后来我遇到了Microsoft的复杂问题登录受信任和不受信任。我不想通过手动帐户合并使我的应用程序过于复杂,但我不知道完全信任哪些其他提供商。保持简单愚蠢的最佳解决方案是什么?

boj*_*eil 8

值得信赖的供应商:

  • 谷歌(前提是它是由谷歌发布的,例如@gmail.com)
  • 雅虎(前提是它是由雅虎发行的,例如@yahoo.com)
  • 微软(前提是它是由微软发行的,例如@outlook.com)
  • Apple(始终经过验证。Apple 的卖点是帐户经过验证和多重身份验证)。
  • 电子邮件链接身份验证。

不受信任的提供商使用并非由提供商发出的电子邮件:

  • Facebook
  • 推特
  • GitHub
  • 谷歌、雅虎、微软等,前提是它们不是由该 IdP 发布的。
  • 电子邮件/密码无需电子邮件验证

Firebase 身份验证是安全的,不会考虑验证某些提供商,因为在某些情况下,电子邮件会验证一次但不会持续验证(在某些情况下,IdP 允许您在验证后更改电子邮件,而无需重新验证)。

解释未经验证帐户的敏感性的最佳方法如下: 1. 攻击者使用他们不拥有的电子邮件victim@example.com 向未经验证的提供商(密码)注册 2. 电子邮件所有者使用victim@example.com 注册使用经过验证的提供商 Google。

如果帐户未重置且密码未链接,则攻击者仍可访问不属于他们的帐户。要解决此问题,用户必须在第 2 步之前验证电子邮件(通过发送电子邮件验证)。这样做,使用 Google 登录将自动合并帐户并保留密码。

这就是为什么在某些情况下,您会收到错误消息:

  1. 使用电子邮件 user@example.com 与未经验证的提供商注册
  2. 使用同一电子邮件的另一个未经验证的提供商登录
  3. 验证第一个帐户的所有权后,要求链接时抛出错误。
  4. 用户希望从第 1 步登录帐户。
  5. 用户现在可以链接步骤 2 中的帐户凭据。

以下是各种情况下的行为摘要:

  1. 现有未经验证的提供商,使用同一电子邮件的另一个未经验证的提供商登录 -> 需要引发链接的错误。(例如。Facebook 其次是 GitHub)
  2. 现有经过验证的提供商,使用同一电子邮件的另一个未经验证的提供商登录 -> 需要引发链接的错误。(例如,谷歌紧随其后的是 Facebook)
  3. 现有未经验证的提供商,使用同一电子邮件的经过验证的提供商登录 -> 经验证的提供商覆盖未经验证的提供商。(例如,Facebook 紧随其后的是 Google)
  4. 现有的经过验证的提供商,使用同一电子邮件的另一个经过验证的提供商登录 -> 两个提供商都已链接且没有任何错误。(例如,苹果紧随其后的是谷歌)

如果您不同意 Firebase 身份验证并希望将 Facebook 视为经过验证的提供商,您始终可以在 Facebook 登录后使用Admin SDK将电子邮件设置为已验证。

希望这有助于澄清这种行为。