0

現在、私の古いGoogle Plusログインコードを新しい方法に変換しています。 基本原則を理解することは非常に難しいです。そしてそれは働かない。 https://developers.google.com/identity/sign-in/android/sign-inFirebaseのGoogleログイン無効なIdp応答

第2のステップはFirebaseです:

最初のステップは、作業中に署名を取得する方法を説明しています。何らかの理由で、上記のドキュメントを以下のものに組み合わせる必要があります。 https://firebase.google.com/docs/auth/android/google-signin

どうしてですか?それはその目的のために非常に複雑すぎるようです:サインインするだけ。 とにかく。あなたは、次の操作を実行する必要があります:あなたが追加する必要があなたの活動のonCreate

:ログインクリックハンドラで

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(webClientId) 
       .build(); 

     mGoogleApiClient = new GoogleApiClient.Builder(mActivity) 
       .enableAutoManage(mContext /* FragmentActivity */, this /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

     mAuth = FirebaseAuth.getInstance(); 

あなたが追加する必要がonActivityResult

Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
mActivity.startActivityForResult(signInIntent, RC_SIGN_IN); 

を追加します

if (requestCode == RC_SIGN_IN) { 
    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 

      AuthCredential credential = GoogleAuthProvider.getCredential(result.getSignInAccount().getIdToken(), null); 
      mAuth.signInWithCredential(credential) 
        .addOnCompleteListener(mActivity, new OnCompleteListener<AuthResult>() { 
         @Override 
         public void onComplete(@NonNull Task<AuthResult> task) { 
          //do something 

         } 
        }); 

     } 

GoogleAuthPrを呼び出すと例外が発生しますgetIdTokenを指定したovider.getCredential。

com.google.firebase.FirebaseException:内部エラーが発生しました。 [Invalid Idp Response:Google ID_tokenはこのアプリケーションでは使用できません。そのオーディエンス(OAuth 2.0クライアントID)はxxxxxxxxxxxx-xxxxxxxxxxxxxx.apps.googleusercontent.comです。これはproject_number:xxxxxxxxxxxxのプロジェクトで使用することは許可されていません。ちょうど

result.getSignInAccount(とトークンを印刷

)getIdToken()。 は問題なく動作します。

このweb_client_idが正しいと確信しています。交換すると、最初のログイン要求が失敗するためです。

auth - > google - > Web SDKの設定でFirebaseコンソールを確認しました。 Webclient-IDとシークレットは、GoogleコンソールのWebアプリケーションクライアントIDのものと一致します。

誰もこの問題を解決する方法を知っていますか?

答えて

0

[OK]を私はいくつかの時間を費やした後、私はすべてのfirebase関連のものを取り除くことにしました。今それは動作します。とにかく、あなたはその火器の材料を必要とする理由はありません。ログ記録のために

私は次のようにしている:あなたの活動やactivityFragmentで

追加:

private static Activity mActivity; 
private FragmentActivity mContext; 
private GoogleApiClient mGoogleApiClient; 
private GoogleSignInResult cachedSignInResult; 
private String webClientId = "XXXXXXXXXXXX-xxxxxxxxxxxxxxx.apps.googleusercontent.com"; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(webClientId) 
       .build(); 

    mGoogleApiClient = new GoogleApiClient.Builder(mActivity) 
       .enableAutoManage(mContext /* FragmentActivity */, this /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 
} 

は、ログイン要求を処理するためのロジックを追加します。

public void requestLogin(OnLoginCompleteListener onLoginCompleteListener) { 

    Log.d(TAG,"request login"); 

    //already logged in scenarios 
    if (isConnected() && cachedSignInResult != null){ 
     Log.d(TAG,"you are already logged in with "+cachedSignInResult.getDisplayName()); 
     onLoginCompleteListener.onLoginSuccess() 
     return; 
    } 
    else if (isConnected()){ 
     Log.d(TAG,"already connected, but no "); 
     silentLogin(onLoginCompleteListener); 
     return; 
    } 

    forceRegularLogin(onLoginCompleteListener); 
} 


public boolean isConnected() { 
    if (mGoogleApiClient == null){ 
     Log.d(TAG,"cannot check isConnected without api client"); 
     return false; 
    } 
    return mGoogleApiClient.isConnecting() || mGoogleApiClient.isConnected(); 
} 

private void silentLogin(final OnLoginCompleteListener onLoginCompleteListener){ 

    OptionalPendingResult<GoogleSignInResult> pendingResult = 
      Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); 

    pendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
     @Override 
     public void onResult(@NonNull GoogleSignInResult googleSignInResult) { 

      if (googleSignInResult.isSuccess()){ 
       Log.d(TAG,"result is ok with name "+googleSignInResult.getSignInAccount().getDisplayName()); 
       cachedSignInResult = googleSignInResult; 
       onLoginCompleteListener.onLoginSuccess() 
      } 
      else{ 
       Log.d(TAG,"not logged in silently. do regular login"); 
       requestLogin(onLoginCompleteListener); 
      } 
     } 
    }); 
} 


private void forceRegularLogin(OnLoginCompleteListener onLoginCompleteListener){ 
    if (mGoogleApiClient == null){ 
     Log.d(TAG,"cannot login in. no google api client"); 
     onLoginCompleteListener.error("no_google_api_client_found"); 
     return; 
    } 

    registeredLoginCallback = onLoginCompleteListener; //register for later use in activity result 

    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    mActivity.startActivityForResult(signInIntent, RC_SIGN_IN); 
} 

add onActivityResult callback

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG,"on activity result"); 

    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 

    if (result.isSuccess()){ 

     if (registeredLoginCallback != null) { 
      registeredLoginCallback.onLoginSuccess(); 
     } 
     else{ 
      Log.e(TAG,"no callback registered for logging in result ok"); 
     } 
    } 
    else{ 
     if (registeredLoginCallback != null) { 
      registeredLoginCallback.error(); 
     } 
     else{ 
      Log.e(TAG,"no callback registered for logging in result error"); 
     } 
    } 
} 

public interface OnLoginCompleteListener{ 
    public void onLoginSuccess(); 
    public void error(String message); 
} 

今すぐログインボタンのコールバックであなたはユーザープロファイル情報

を取得するには、以下の方法およびインターフェースを追加することができますまた

requestLogin(new OnLoginCompleteListener() { 
     @Override 
     public void onLoginSuccess() { 
      Log.d(TAG,"logged in"); 
     } 
     @Override 
     public void error(String message) { 
      Log.d(TAG,"error logging in"+message); 
     } 
} 

を追加し、完全なコールバック用のインターフェイスを追加

public void requestCurrentPerson(final OnRequestSocialPersonCompleteListener onRequestSocialPersonCompleteListener) { 

    Log.d(TAG,"request current person"); 

    silentLogin(new OnLoginCompleteListener() { 
     @Override 
     public void onLoginSuccess(i) { 

      SocialPerson socialPerson = new SocialPerson(); 
      socialPerson.id = signInResult.getSignInAccount().getId(); 
      socialPerson.name = signInResult.getSignInAccount().getDisplayName(); 
      socialPerson.avatarURL = signInResult.getSignInAccount().getPhotoUrl().toString(); 
      onRequestSocialPersonCompleteListener.onRequestSocialPersonSuccess(socialPerson); 
     } 

     @Override 
     public void error(String message) { 
      onRequestSocialPersonCompleteListener.error("error_fetching_social_person "+message); 
     } 
    }); 
} 


public interface OnRequestSocialPersonCompleteListener { 

    public void onRequestSocialPersonSuccess(SocialPerson socialPerson); 
    public void error(String message); 
} 

ログイン後、

requestCurrentPerson(new OnRequestSocialPersonCompleteListener() { 
        @Override 
        public void onRequestSocialPersonSuccess(SocialPerson socialPerson) { 
          Log.d(TAG,"this is my persoin "+socialPerson); 
        } 
        @Override 
        public void error(Message message) { 
          Log.d(TAG,"error_fetching_social_person " +message); 
        } 
} 
関連する問題