2016-06-15 15 views
3

私は自分のアプリで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); 

         }); 

誰かが何らかの助けを思いつくことを望みます。

答えて

2

Facebookは社会的アイデンティティプロバイダーであり、電子メールを所有していません。電子メールがハッキングされた場合、Facebookはそれを検出してこの電子メールで登録されたアカウントを無効にすることはできません。 Googleは電子メールプロバイダですが、そのアカウントはより安全と考えられています。

この理論に基づいて、シナリオ2は1とは異なります。シナリオ1では、ユーザーはGoogleと最初に署名してこのメ​​ールの所有権を証明しました。したがって、ユーザーは同じ電子メールを使用してFacebookアカウントを追加することができます。シナリオ2では、Facebookサインインが最初に行われ、このプロバイダレコードは信頼できないため、ユーザーが別の信頼できるプロバイダにサインインすると削除されます。

コードの動作は、どちらのシナリオでも正しいです。

+1

優れた説明をありがとう。それで、最初はメールとパスワードで登録した後、GoogleでGoogleと置き換えたのはなぜですか? –

+0

この動作は文書化されていますか? –

-1

今のところ電子メールとパスワードの認証を使用するか、サードパーティのプラグインを使用しないでください。

関連する問題