Flutter 如何链接Flatter中firebase_auth 0.11.1中的firebase帐户?

Flutter 如何链接Flatter中firebase_auth 0.11.1中的firebase帐户?,flutter,firebase-authentication,Flutter,Firebase Authentication,我已经使用firebase_auth 0.11.0成功地实现了Google和Facebook对Flatter的登录。我需要为具有相同电子邮件地址的帐户实施链接帐户功能 Future<FirebaseUser> _signInWithGoogle() async { final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); final GoogleSignInAuthentication googl

我已经使用firebase_auth 0.11.0成功地实现了Google和Facebook对Flatter的登录。我需要为具有相同电子邮件地址的帐户实施链接帐户功能

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);
Future\u使用Google()异步登录{
final GoogleSignInAccount googleUser=wait_googleSignIn.signIn();
最终GoogleSignInAuthentication googleAuth=等待googleUser.authentication;
final AuthCredential credential=GoogleAuthProvider.getCredential(
accessToken:googleAuth.accessToken,
idToken:googleAuth.idToken,
);
最终FirebaseUser用户=使用凭证(凭证)等待身份验证登录;
您如何/在何处发现Firebase错误(身份验证/帐户使用不同的凭据存在),该帐户是一封重复的电子邮件,因此需要使用
linkwithcredential
功能?我尝试在上面的
signInWithCredential
\u signInWithGoogle()
上捕获错误,但没有成功

根据此处的示例:

FirebaseUser user=wait auth.currentUser();
user=等待user.linkWithCredential(凭证);

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


编辑:为了清楚起见,我可以在只有一个凭证/会话存在时链接帐户吗?例如,流程应该是,使用Facebook登录,捕获(错误\u帐户\u存在\u凭证不同),然后链接到Google。

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

List providerList=\u auth.currentUser().providerData;


//捕获带有百分位数的登录错误,检查错误类型,然后执行操作 ///可能的错误:

  • 错误\u无效\u凭证
    -如果凭证数据格式错误或已过期
  • ERROR\u USER\u DISABLED
    -如果用户已被禁用(例如,在Firebase控制台中)
  • ERROR\u ACCOUNT\u EXISTS\u WITH\u DIFFERENT\u CREDENTIAL
    -如果已经存在一个具有Google声明的电子邮件地址的帐户。请通过调用[FetchSigningMethodsForemail],然后要求用户使用其中一个帐户登录来解决此问题。只有在“每个电子邮件地址一个帐户”的情况下,才会引发此错误在Firebase控制台中启用设置(推荐)
  • ERROR\u OPERATION\u NOT \u ALLOWED
    -表示未启用Google帐户
  • 错误\u无效\u操作\u代码
    -如果链接中的操作代码格式错误、过期或已被使用
final onError=(异常,堆栈跟踪){
/*错误处理*/
};


final FirebaseUser user=wait _auth.signin with credential(credential).catchError(onError);

基于此信息:

(如果仍然准确的话)我的流量无法实现,也就是说,在没有登录第一个firebase帐户的情况下,你不能链接帐户,例如登录谷歌,然后登录并链接Facebook


我需要的用户流需要通过为同一封电子邮件启用多个帐户来实现。虽然这会带来其他问题,但第二个firebase帐户用户
FirebaseUser
不包含电子邮件
user.email
null
。尽管
user.providerData
有电子邮件。

链接到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);
            }
          }
        }
      });
FacebookLoginResult FacebookLoginResult=Wait_handleFBSignIn();
最终accessToken=facebookLoginResult.accessToken.token;
如果(facebookLoginResult.status==FacebookLoginStatus.loggedIn){
最终facebookAuthCred=
getCredential(accessToken:accessToken);
最终用户=wait auth.signiWithCredential(facebookAuthCred).catchError((e)async{
如果(e.code=='错误\u帐户\u存在\u与\u凭证不同'){
var graphResponse=wait http.get(
'https://graph.facebook.com/v2.12/me?fields=name,名字,姓氏,电子邮件,图片。宽度(400)和访问令牌=${facebookLoginResult
.accessToken.token}');
Map profile=json.decode(graphResponse.body);
profileData=profile;
var email=profile[“email”];
final SignenMethods=等待FirebaseAuth.instance
.FetchSigningMethodForEmail(电子邮件:电子邮件);
if(signInMethods.contains(“google.com”)){
final authGoogleResult=等待googleLogin();
if(authGoogleResult.user.email==e.email){
等待authGoogleResult.user.linkWithCredential(e.credential);
}
}
}
});

我发现有两种情况可以解决这个问题。a)如果我在Firebase控制台中为每个电子邮件地址启用一个帐户,我可以捕获错误\u account\u EXISTS\u带有不同的\u凭证和\u auth.signInWithCredential,问题是如何从这里链接它们,因为用户从未登录,currentuser为空。b)如果我允许mul控制台中有多个帐户,它会创建两个帐户,我可以从提供商数据中提取电子邮件,但firebase用户对象本身没有电子邮件。在这种情况下,currentuser.providerdata有电子邮件,但firebase用户user.email为空。我下面的问题是,捕获错误后linkwithcredential是否是有效的工作流使用不同的凭据登录?我正在尝试类似的操作,但由于他们已将linkwithcredential移动到用户,因此我没有当前用户将FirebaseUser user=await _auth.signInWithCredential(CREDENTIAL).catchError((e)async{if(e.code='ERROR\u ACCOUNT\u EXISTS\u与不同的凭据一起存在)){FirebaseUser user=wait _auth.currentUser();user.linkWithCredential(credential);}打印(e.message+“message”);打印(e.code+“code”);打印(e.details);};