流程步骤:

  1. 登录Twitter mail@gmail.com(成功)
  2. 登录Google mail@gmail.com(成功重写Google的提供程序)
  3. 再次登录Twitter mail@gmail.com(失败,帐户已存在于不同的Provider )

我对第二步感到很困惑..因为,Firebase不会阻止登录到GoogleProvider 并重写Provider

Future<Either<Failure, Unit>> signInWithTwitter() async {
    try {
      if (kIsWeb) {
        await _firebaseAuth.signInWithPopup(_twitterAuthProvider);
      } else {
        await _firebaseAuth.signInWithProvider(_twitterAuthProvider);
      }

      return right(unit);
    } on FirebaseAuthException catch (e) {
      return left(
        Failure.authFailure(
          message: e.toString(),
        ),
      );
    }
  }
Future<Either<Failure, Unit>> signInWithGoogle() async {
    try {
      final googleUser = await _googleSignIn.signIn();
      if (googleUser == null) {
        return left(const Failure.authFailure());
      }

      final googleAuthentication = await googleUser.authentication;

      final authCredential = GoogleAuthProvider.credential(
        idToken: googleAuthentication.idToken,
        accessToken: googleAuthentication.accessToken,
      );

      await _firebaseAuth.signInWithCredential(authCredential);

      return right(unit);
    } on FirebaseAuthException catch (e) {
      return left(
        Failure.authFailure(
          message: e.toString(),
        ),
      );
    }
  }

那么,如果已经存在其他Provider (如Twitter、GitHub、Facebook等)的帐户,如何阻止用户登录?

推荐答案

在Provider 是特定邮箱地址的已知来源的情况下,对于某些邮箱地址,FireBase身份验证的概念为preferred providers.在您的示例中,首选为mail@gmail.com的Google登录提供程序,因为Google是保证创建了该邮件地址的实体.

换句话说:任何人在Twitter上登录时都可以声称自己是mail@gmail.com岁,但当有人通过谷歌以mail@gmail.com岁登录时,你就可以保证他们就是他们声称的那个人.这就是为什么Firebase身份验证让GoogleProvider 在您的步骤2中接管帐户的原因.

有关这方面的更多信息,另请参阅:

如果你不希望你的应用程序发生这种情况,在用户输入他们的邮箱地址以判断该邮箱地址是否已经存在后,call fetchSignInMethodsForEmail.

Flutter相关问答推荐

Flutter Go路由深度链接不按预期工作

从底部开始固定,然后使其可拖曳Flutter

为什么我的页面控制器在使用Riverpod时没有更改我的页面视图?

Flutter /dart 列表.第一个子类列表中的Where()错误

如何在Flutter中制作弯曲文本

Flutter在CustomPainter的右上角和左上角添加了2条曲线

GridView 渲染项目之间有微小的间隙

Flutter记录返回类型问题

有没有办法在 google_map 上移动标记(向左或向右移动一些像素)?

文本溢出文本框 - Flutter

更改下拉按钮的背景 colored颜色 - flutter

如何使用 riverpod_annotation 创建非自动处置提供程序?

Flutter - 根据从第一个 DropdownButtonForm 中 Select 的内容在第二个 DropdownButton 上显示选项

将 String 与 List 元素进行比较时出现问题

如何将 List 转换为 String []?

如何从 showModalBottomSheet 中的 topRight 和 topLeft 移除平边

Flutter - 异步文件读取异常处理

为什么容器会填满整个空间?

为什么这个循环只发生一次?Flutter /dart

如何在Flutter 中制作自定义微调器?