我已经成功实现了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.email
是null
。尽管user.providerData
有电子邮件。