【问题标题】:Trying to understand Firebase Authentication one account per email address and trusted providers试图了解 Firebase 身份验证每个电子邮件地址和受信任的提供商一个帐户
【发布时间】:2020-06-01 03:56:59
【问题描述】:

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

我似乎无法找到一份完整的列表来说明哪些提供商是受信任和不受信任的。通过将解决方案实施到我的应用中,我发现了以下内容:

值得信赖的供应商:

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

不可信的提供者:

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

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

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

【问题讨论】:

    标签: oauth-2.0 firebase-authentication


    【解决方案1】:

    值得信赖的供应商:

    • Google(如果它是由 Google 发布的,例如@gmail.com)
    • Yahoo(前提是由 Yahoo 发布,例如@yahoo.com)
    • Microsoft(如果它是由 Microsoft 发布的,例如@outlook.com)
    • Apple(始终经过验证。Apple 的卖点是帐户经过验证和多重身份验证)。
    • 电子邮件链接身份验证。

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

    • 脸书
    • 推特
    • GitHub
    • Google、Yahoo、Microsoft 等,只要它们不是由该 IdP 发布的。
    • 电子邮件/密码,无需电子邮件验证

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

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

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

    这就是为什么在某些情况下会出现错误:

    1. 使用电子邮件 user@example.com 向未经验证的提供商注册
    2. 使用同一电子邮件的另一个未经验证的提供商登录
    3. 在验证第一个帐户的所有权后引发需要链接的错误。
    4. 用户应从第 1 步开始登录帐户。
    5. 用户现在可以链接第 2 步中的帐户凭据。

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

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

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

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

    【讨论】:

    • 当你写“需要抛出链接的错误,是FirebaseAuthUserCollisionException吗?根据文档,每次用户尝试使用第二个Bprovider登录时都应该抛出它(链接到a@b .com)当已经使用 Aprovider 创建了帐户(链接到 a@b.com)。但实际上,我发现此文档具有误导性,因为 Google 和 Apple 使用相同的电子邮件地址登录(当电子邮件地址共享时) ) 静默合并而不是抛出 FirebaseAuthUserCollisionException.
    • 这是否意味着,当受信任的提供者共享相同的电子邮件地址时,它们会合并到一个帐户中,但是如果一个是不受信任的提供者,那么它会抛出FirebaseAuthUserCollisionException
    • 嗨,bojeil,很好的总结,谢谢。但是,我第一次尝试使用未经验证的提供商登录的第 5 种情况呢?例如,我创建了一个用户(使用 admin SDK),然后用户尝试使用 Microsoft 登录? (其中域不是@hotmail)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 2017-07-03
    • 2019-05-17
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多