如何在flutter中链接firebase_auth 0.11.1中的firebase帐户?

时间:2019-05-22 15:26:06

标签: flutter firebase-authentication

我已经使用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()上的错误,但无济于事。

基于此处的示例:

https://github.com/flutter/plugins/blob/06256967e494e6d719023a249c8bdaae4b3ae065/packages/firebase_auth/test/firebase_auth_test.dart

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

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

编辑:为清楚起见,当只有一个凭据/会话时,我可以链接帐户吗?例如,该流应为,使用Facebook登录,捕获(ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL),然后链接到Google。

3 个答案:

答案 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.emailnull。尽管user.providerData收到了电子邮件。