13

關於此模糊錯誤代碼已有幾個問題,但沒有人爲我解決過這個問題,所以我會再試一次。首先,這裏是登錄的樣板代碼。Android身份驗證錯誤:「GetToken失敗,狀態碼:INVALID_AUDIENCE」

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestEmail() 
     .requestServerAuthCode("web app client ID copied from Dev API Console", false) 
     .build(); 


    mGoogleApiClient = new GoogleApiClient.Builder(this).enableAutoManage(this, this).addApi(Auth 
     .GOOGLE_SIGN_IN_API, gso).build(); 

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

通過此代碼,我得到一個對話框,並可以選擇適當的用戶帳戶。好極了!但是,我在onActivityResult中取消了代碼,因此我檢查了logcat,並注意到標題中的錯誤消息。然後我尋找其他有這個問題的人,但一直沒能弄清楚我的情況是什麼。

那麼讓我們來檢查其他帖子的常見問題。

  • 的火力地堡控制檯顯示我的應用程序與正確的SHA-1和SHA-256指紋
  • 發佈和調試建立使用相同的密鑰庫
  • 在谷歌API的經理,我的「在OAuth同意註冊屏」配置
  • 我也驗證了授權的域名重定向的URI
  • 我重新下載了火力地堡GoogleServices.json文件,只是要確定
  • 沒有包名的問題。事實上,Firebase Analytics在這款應用上運行得很好
  • 在Play商店開發控制檯中,我的OAuth客戶端顯示在「設置 - > API訪問」中
  • 我的Firebase項目在Play中鏈接
  • 我已經等了10個小時,只是爲了看看谷歌的後端需要時間來設置此

對於搜索性,在標題中logcat的錯誤信息後即商店,開發者控制檯「關聯的帳戶」設置部分,我得到以下logcat打印。

You have wrong OAuth2 related configurations, please check. Detailed error: INVALID_AUDIENCE

+0

您的應用中使用了哪個版本的Firebase? –

+0

@RosárioPereiraFernandes,我使用的是firebase/play-services版本10.2。 – Justin

回答

1

您的Web客戶端ID必須在與Firebase相同的用戶帳戶中生成,而不是您的Play商店帳戶。就我而言,這兩個帳戶是分開的,Google會拋出此錯誤,而不是正確鏈接信息。我的Firebase帳戶與我的Play商店帳戶相關聯,但顯然這並不意味着網絡客戶端ID將被共享。我嘗試了其他一些解決方案,例如鏈接API管理器帳戶,但這也沒有奏效。您必須在Firebase在與您的Firebase帳戶相同的API Manager帳戶中使用的同一項目中創建Web客戶端ID。

+0

如何在Firebase中創建網站客戶端ID? –

0

問題出在您的client_id,用於google auth過程。從當前項目中刪除該文件。然後添加一個新實例。這一次仔細注意身份證。使用android-studio生成firebase的設置。 你必須有一個項目與多個客戶端ID 一個是你的Android應用程序,與SHA。最安全的方法是在Google控制檯中刪除當前的項目。然後重新創建它。然後在android studio中go tools => firebase,然後選擇要整合的設置。我不建議手動添加。

+0

你如何準確初始化你的auth實例? – Remario

+0

感謝您使用工具=> Firebase的提示。不幸的是,這隻重新下載了相同的JSON文件,導致沒有改變。如上所述,這是一個現場Firebase項目。我當然不會刪除這個項目並重新添加它。數以百萬計的客戶將有一個破碎的應用程序。 – Justin

0

落實到你的活動

GoogleApiClient.OnConnectionFailedListener 

安裝這些私有變量

private GoogleApiClient mGoogleApiClient; 
private FirebaseAuth mFirebaseAuth; 
private FirebaseAuth mFirebaseAuth; 
private static final int RC_SIGN_IN = 9001; 

配置谷歌登錄

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(SignInActivity.this.getResources().getString(R.string.default_web_client_id)) 
      .requestEmail() 
      .build(); 

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

初始化FirebaseAuth

mFirebaseAuth = FirebaseAuth.getInstance(); 
    mFirebaseUser = mFirebaseAuth.getCurrentUser(); 
    if (mFirebaseUser == null) { 
     // Not signed in, launch the Sign In activity 
    } else { 
     // Already signed in, launch the Home activity 
     //You can use mFirebaseUser.getDisplayName()/getUid()/getEmail() /getPhotoUrl() 

    } 

登錄方法

private void signIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 

onActivityResult()

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.e("Data",data.getExtras().toString()); 
    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
    if (requestCode == RC_SIGN_IN) { 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     Log.e("Result","status "+result.getStatus()+"Success"+result.isSuccess()+" "+result.getSignInAccount()); 
     if (result.isSuccess()) { 
      // Google Sign In was successful, authenticate with Firebase 
      GoogleSignInAccount account = result.getSignInAccount(); 
      firebaseAuthWithGoogle(account); 
     } else { 
      // Google Sign In failed 
      Log.e(TAG, "Google Sign In failed."); 
     } 
    } 
} 

firebaseAuthWithGoogle

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId()); 
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mFirebaseAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         Log.w(TAG, "signInWithCredential", task.getException()); 
         Toast.makeText(SignInActivity.this, "Authentication failed.", 
           Toast.LENGTH_SHORT).show(); 
        } else { 
         Toast.makeText(SignInActivity.this, "Authentication Successful.", 
           Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 
} 

onConnectionFailed()

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    // An unresolvable error has occurred and Google APIs (including Sign-In) will not 
    // be available. 
    Log.d(TAG, "onConnectionFailed:" + connectionResult); 
    Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); 
} 

登錄淘汰方法

private void signOut() { 
     Auth.GoogleSignInApi.signOut(mGoogleApiClient). 
       setResultCallback(new ResultCallback<Status>() { 
        @Override 
        public void onResult(@NonNull Status status) { 
        } 
       }); 
     mFirebaseAuth.signOut(); 
} 

日誌保留在everypoint。 如果你正確地結合了你所做的所有事情,

+0

感謝Ashutosh。不過,我已經在做所有這些。如上所述,我在onActivityResult中遇到錯誤。如果你很好奇,這裏是你的日誌打印。結果:status Status {statusCode =未知狀態代碼:12501,resolution = null} Successfalse null – Justin