[英]Firebase Auth link provider Google sign in issue?
在第一个屏幕截图中,您使用 Firebase 的电子邮件+密码提供商登录。 虽然这是一种有效的登录方法,但这意味着任何人都可以输入该 email 地址,即使他们实际上无法访问该 gmail 地址的 Google 帐户。
这里不存在安全风险,但是我们可以对 email 地址的值的信任度较低。 由于这个原因,帐户的emailVerified
属性被标记为false
,您通常需要要求用户在允许他们继续之前验证他们的 email 地址。
在第二个屏幕截图中,用户使用相同的 email 地址登录,但现在使用 Firebase 的google.com
提供商登录。 这意味着 Google 现在已经验证用户可以访问该帐户的底层 gmail 地址。 由于google.com
提供程序是@gmail.com
帐户的受信任提供程序,因此系统将替换以前的帐户。
另见:
您通常希望防止多个用户使用相同的 email 地址进行注册。 为此,您需要将 Firebase 配置为在控制台中每个 email 地址只允许一个帐户,然后使用帐户链接,以便合并您方案中的两个(电子邮件+密码和 google.com)帐户。
您是否在第一次登录尝试时验证了 email 或电话号码? 如果没有,这是设计使然:
登录完成后,任何以前未经验证的登录机制都将从用户中删除,任何现有会话都将失效。 例如,如果有人之前使用相同的 email 和密码创建了一个未经验证的帐户,则该用户的密码将被删除,以防止声称拥有所有权并创建该未经验证帐户的冒充者使用未经验证的 email 和密码再次登录。
我刚刚遇到了这个问题,这里有一个更长更深入的描述。 (情况经常变化,2021 年 11 月确实如此。)
简短版:正如@Frank van Puffelen
所说,这是设计使然。 问题是email+password
通常不是受信任的提供商,因此像Google Authentication
这样的受信任提供商会覆盖该方法。 它默默地这样做(我认为,没有检查GoogleSignInAuthentication
object 中的每个字段。)
它会在密码重置后自动链接。 因此,一种选择是让用户通过_firebaseAuth.sendPasswordResetEmail(email: email);
设置他们的密码。
另外:我不建议像其他人建议的那样关闭One account per email address
。 看到最后的原因。
One account per email address
在我的应用程序中,会发生以下情况。
c_example_account@gmail.com
创建一个帐户,如 firebaseAuth 仪表板中的信封/邮件图标所示。 c_example_account@gmail.com
User UID
是相同的。 因此,与该User UID
相关联的任何内容仍然可以。c_example_account@gmail.com
的电子邮件/密码登录方法 (AKA) 提供程序已删除,因此用户无法再使用该方法登录。 重要提示:这是静默完成的,用户不会收到任何电子邮件/密码登录已删除的通知。Incorrect Password
。 注意:人们可能期望它会给出一个错误,比如“只有 Google 登录可用”,但事实并非如此。 将此与 email 不存在时(如尝试垃圾@123457.com)进行对比,后者有错误Email is not found...
现在,它变得有点奇怪......
Future<void> resetPassword(String email) async {
await _firebaseAuth.sendPasswordResetEmail(email: email);
}
createUserWithEmailAndPassword()
之类的 await _firebaseAuth.createUserWithEmailAndPassword(
email: email,
password: password,
);
...但这次它是通过“重置”事件创建的
Future<void> resetPassword(String email) async {
await _firebaseAuth.sendPasswordResetEmail(email: email);
}
...通过由 firebaseAuth firebaseAuth service
发送的 email 提供了一个链接。 在这种情况下,验证了 email。
User UID
,多种登录方式~~我在firebaseAuth中找不到这个记录,可能是因为我看起来不够努力,或者可能因为这不是一个常见的问题。 ~~ 此行为记录在2020 年 4 月的问题评论中。
我认为原因是因为_firebaseAuth.createUserWithEmailAndPassword
版本具有未经验证的 email 。 因此,假设电子邮件+密码组合不存在,任何人都可以为其他任何人创建帐户。 例如,我可以使用用户名president@whitehouse.gov
创建一个帐户,而实际上没有访问该 email 的权限。 如果实际的总统通过Google Authentication
登录,那么我就可以伪造访问该用户的信息。 除了聪明的谷歌工程师决定,经过验证的Google Authentication
然后触发删除未经验证的Email/Password
提供程序/帐户实例。
简而言之,逻辑可能是:已验证的胜过/未验证的覆盖。 请参阅https://firebase.google.com/docs/auth/users#verified_email_addresses
同样,对于电子邮件/密码,这些都没有明确记录。 但它在文档中有所暗示,例如Facebook Auth
帐户是否被Google Auth
覆盖。
复制自: https://firebase.google.com/docs/auth/users#verified_email_addresses
由我添加的粗体,用于强调
在某些情况下,当用户使用相同的 email 地址登录不同的提供商时,Firebase 将自动链接帐户。 但是,这只有在满足特定标准时才会发生。 要了解原因,请考虑以下情况:用户使用 @gmail.com 帐户使用 Google 登录,而恶意行为者使用相同的 @gmail.com 地址创建帐户,但通过 ZD85544FCE402C7A2A936A48078ED 登录。 如果这两个帐户被自动链接,恶意行为者将获得对用户帐户的访问权限。
以下情况描述了我们何时自动关联帐户以及何时抛出需要用户或开发人员操作的错误:
- 用户使用不受信任的提供商登录,然后使用具有相同 email 的另一个不受信任的提供商登录(例如,Facebook 后跟 GitHub)。 这会引发需要帐户链接的错误。
- 用户使用受信任的提供商登录,然后使用具有相同 email 的不受信任的提供商登录(例如,Google 后跟 Facebook)。 这会引发需要帐户链接的错误。
- 用户使用不受信任的提供商登录,然后使用具有相同 email 的受信任提供商登录(例如,Facebook 后跟 Google)。 受信任的提供者覆盖不受信任的提供者。 如果用户尝试使用 Facebook 再次登录,则会导致需要帐户链接的错误。
- 用户使用受信任的提供商登录,然后使用具有相同 email 的不同受信任提供商登录(例如,Apple 后跟 Google)。 两个提供者将无错误地链接。
您可以手动设置 email 并使用管理员 SDK 进行验证,但我们建议您仅在知道用户确实拥有 email 时才这样做。
One account per email address
默认情况下,@ Deva所写的One account per email address
处于活动状态。 但是,取消选中这意味着同一个 email 有两个不同的帐户( User UIDs
)。 一种通过Email/Password
,另一种通过Google Authentication
。 他们将在Firebase Auth
中有单独的用户 UID ,这可能会让您感到困惑。 此外,如果您在您的应用程序中手动链接两个User UIDs
,这会产生一个安全漏洞:有人可以在没有 email 验证的情况下创建一个帐户来访问现有帐户。 所以不要那样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.