您如何在Firebase_auth 0.11.1中链接Firebase帐户



我已经成功实现了Google和Facebook签名INS flutter使用Firebase_Auth 0.11.0。我需要为具有相同电子邮件地址的帐户实现链接帐户功能。

Future<FirebaseUser> _signInWithGoogle() async {
  final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
  final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
  final AuthCredential credential = GoogleAuthProvider.getCredential(
  accessToken: googleAuth.accessToken,
  idToken: googleAuth.idToken,
);
final FirebaseUser user = await _auth.signInWithCredential(credential);

您如何/在哪里捕获firebase错误(auth/account-Exiant-crententential-credential(是一个重复的电子邮件,因此需要linkwithcredential函数?我试图在上面的signInWithCredential_signInWithGoogle()上捕获错误。

基于此处的示例:

FirebaseUser user = await auth.currentUser(); user = await user.linkWithCredential(credential);

这是您链接帐户的方式,但是我的问题是您如何确定需要运行此功能?

编辑:为了清楚起见,我可以在仅存在一个凭据/会话时链接帐户吗?例如,该流程应为,与Facebook登录(error_account_exists_with_different_credential(,然后链接到Google。

获取当前用户的提供商ID列表,如果它具有FB,但没有Google,则可以将Google链接到

List<UserInfo> providerList = _auth.currentUser().providerData;


//用系列捕获符号的错误,检查错误类型,ACT ///可能的错误:

  • ERROR_INVALID_CREDENTIAL-如果凭据数据畸形或已过期。
  • ERROR_USER_DISABLED-如果用户已被禁用(例如,在Firebase Console中(
  • ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL-如果已经存在一个帐户,该帐户带有Google主张的电子邮件地址。通过调用[FetchSignInmethodsForemail]来解决此情况,然后要求用户使用其中一个登录。仅当在Firebase控制台中启用"每个电子邮件地址"设置时,才会抛出此错误(建议(。
  • ERROR_OPERATION_NOT_ALLOWED-指示未启用Google帐户。
  • ERROR_INVALID_ACTION_CODE-如果链接中的操作代码已畸形,已过期或已被使用。

final onError = (exception, stacktrace) { /*ERROR HANDLING*/ };

final FirebaseUser user = await _auth.signInWithCredential(credential).catchError(onError);

要链接Google和Facebook,我正在使用:

FacebookLoginResult facebookLoginResult = await _handleFBSignIn();
    final accessToken = facebookLoginResult.accessToken.token;
    if (facebookLoginResult.status == FacebookLoginStatus.loggedIn) {
      final facebookAuthCred =
      FacebookAuthProvider.getCredential(accessToken: accessToken);
      final user = await auth.signInWithCredential(facebookAuthCred).catchError((e) async {
        if (e.code == 'ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL') {
          var graphResponse = await http.get(
              'https://graph.facebook.com/v2.12/me?fields=name,first_name,last_name,email,picture.width(400)&access_token=${facebookLoginResult
                  .accessToken.token}');
          Map<String, dynamic> profile = json.decode(graphResponse.body);
          profileData = profile;
          var email = profile["email"];
          final signInMethods = await FirebaseAuth.instance
              .fetchSignInMethodsForEmail(email: email);
          if (signInMethods.contains("google.com")) {
            final authGoogleResult = await googleLogin();
            if (authGoogleResult.user.email == e.email) {
              await authGoogleResult.user.linkWithCredential(e.credential);
            }
          }
        }
      });

基于以下信息:将多个身份验证提供商与登录的firebase链接

(如果仍然准确(我的流程是无法实现的,即,如果未登录第一个Firebase帐户,例如,您无法链接帐户,例如登录到Google,然后登录并链接Facebook。

我需要通过为同一封电子邮件启用多个帐户来实现我需要的用户流。尽管这构成了其他问题,但第二个Firebase帐户用户FirebaseUser user不包含电子邮件,但user.emailnull。尽管user.providerData有电子邮件。

最新更新