我已经使用firebase_auth 0.11.0成功地实现了Flutter的Google和Facebook登录。我需要为具有相同电子邮件地址的帐户实现链接帐户功能。
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登录,捕获(ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL),然后链接到Google。
答案 0 :(得分:2)
要链接google和facebook,我正在使用:
var vara = _context.maintable.Where(a => a.tablerelatedtomain.SelectMany(b => b.tablerelatedtoprevious).SelectMany(c => c.tablerelatedtoprevious).Any(c => c.status == "mystring")).ToList();
var varb = _context.maintable.Where(a => a.tablerelatedtomain.SelectMany(b => b.tablerelatedtoprevious).Any(b => b.status == "mystring")).ToList();
var varc = _context.maintable.Where(a => a.tablerelatedtomain.Any(a => a.status == "mystring")).ToList();
var result = vara.Union(varb).Union(varc).OrderBy(z => z.id).ToList();
return result;
答案 1 :(得分:0)
获取当前用户的提供者ID的列表,如果它具有FB但没有Google,则可以将Google链接到它
List<UserInfo> providerList = _auth.currentUser().providerData;
///使用凭据捕获登录错误,检查错误的类型,采取措施 ///可能的错误:
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);
答案 2 :(得分:0)
基于以下信息:Linking multiple auth providers with Firebase on Login
(如果仍然准确)我的流程无法实现,即,您必须先登录第一个Firebase帐户才能链接帐户。登录到Google然后登录并链接Facebook。
我需要通过为同一封电子邮件启用多个帐户来实现我需要的用户流。尽管这带来了其他问题,但是第二个Firebase帐户用户FirebaseUser user
不包含电子邮件,user.email
是null
。尽管user.providerData
收到了电子邮件。