私は自分のアプリでFirebase認証を使用していて、特定のユースケースに問題があることに気付きました。GoogleによるFirebase認証の問題
私のアプリのサインアップフローのため、が有効になっているので、複数のプロバイダを1つのメールアドレスに関連付けることができます。
シナリオ1:(ファインワークス)
ユーザーは、最初はいつか後にグーグルとFacebookやメールアドレスとパスワードを使用して登録すると中で兆候をサインアップしています。
アカウントリンクが正常に機能しますとFacebookや電子メールがプロバイダリストに追加されます。
私は、電子メール、Google(当初)、Facebookとパスワード(その後)に2〜3のプロバイダを持つことができます。
シナリオ2:(バグ)ユーザーは、Facebookや/または最初にメールやGoogleとの後のサインとサインアップした
、今のアカウントのリンクは動作しません。 Googleは以前存在していたプロバイダを置き換えます。
アカウントのリンクが失敗する、私は電子メールアドレスに関連付けられた唯一のプロバイダとしてGoogleを持っているだけです。 Googleのでログインする間に、第2のシナリオでは
、、それが失敗し、FirebaseAuthCollisionException
を投げるが、それはないと成功しなければなりません。 これは主な問題です。
ここでコード全体を貼り付けることはできませんが、スニペットを貼り付けることはできません。
firebaseAuth
.signInWithCredential(credential)
.addOnFailureListener(exception -> {
if (exception instanceof FirebaseAuthUserCollisionException) {
mCredentialToLinkWith = credential;
if (mProviderList.size() == 1) {
if (mProviderList.contains(EmailAuthProvider.PROVIDER_ID)) {
mRegisterProviderPresenter.linkWithEmailProvider(credential, email);
} else {
linkProviderAccounts(email, AuthenticationHelper.getProviderToLinkAccounts(mWeakActivity, mProviderList));
}
} else {
linkProviderAccounts(email, AuthenticationHelper.getProviderToLinkAccounts(mWeakActivity, mProviderList));
}
} else {
Timber.d("Failed in signInWithCredential and unexpected exception %s", exception.getLocalizedMessage());
mRegisterProviderPresenter.onRegistrationFailed(new ErrorBundle(ErrorBundle.FIREBASE_ERROR, exception.getLocalizedMessage()));
}
})
.addOnSuccessListener(authResult -> {
Timber.d("Success: signInCred");
FirebaseUser firebaseUser = authResult.getUser();
/**
* Store the user details only for first time registration
* and not while acc linking
*/
storeUserCredentials(firebaseUser);
AuthenticationHelper.logUserDetails(firebaseUser);
mRegisterProviderPresenter.onRegistrationSuccess(mAlreadyRegistered);
});
誰かが何らかの助けを思いつくことを望みます。
優れた説明をありがとう。それで、最初はメールとパスワードで登録した後、GoogleでGoogleと置き換えたのはなぜですか? –
この動作は文書化されていますか? –