内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我已经使用firebase_auth 0.11.0成功实施了谷歌和Facebook登录Flutter。我需要为具有相同电子邮件地址的帐户实施关联帐户功能。
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-exists-with-different-credential)该帐户是重复的电子邮件,因此需要该linkwithcredential
功能?我试图抓住错误signInWithCredential
以及_signInWithGoogle()
无效。
根据这里的例子:
FirebaseUser user = await auth.currentUser(); user = await user.linkWithCredential(credential);
这是您链接帐户的方式,但我的问题是您如何确定需要运行此功能?
编辑:为清楚起见,当只有一个凭据/会话存在时,我可以链接帐户吗?例如,流程应该是,用Facebook登录,catch(ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL),然后链接到Google。
基于以下信息:在登录时将多个身份验证提供程序与Firebase链接
(如果仍然准确)我的流量是无法实现的,即您无法在未登录第一个firebase帐户的情况下链接帐户,例如登录Google THEN登录并链接Facebook。
我需要的用户流程需要通过为同一封电子邮件启用多个帐户来实现。虽然这会带来更多的问题,第二个火力点帐户用户FirebaseUser user
不包含电子邮件,user.email
是null
。虽然user.providerData
有电子邮件。
获取当前用户的提供商ID列表,如果它有FB但没有Google,那么Google可以链接到它
List<UserInfo> providerList = _auth.currentUser().providerData;
//使用crecentials捕获登录的错误,检查错误类型,执行///可能的错误:
ERROR_INVALID_CREDENTIAL
- 如果凭据数据格式错误或已过期。ERROR_USER_DISABLED
- 如果用户已被禁用(例如,在Firebase控制台中)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);