web-dev-qa-db-ja.com

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を確認すると、タイトルにエラーメッセージが表示されます。次に、この問題を抱えている他の人を検索しますが、私の場合の問題が何であるかを理解できませんでした。

それでは、他の投稿から一般的な問題をチェックしてみましょう。

  • Firebaseコンソールに、アプリが正しいSHA-1およびSHA-256フィンガープリントで登録されていることが表示されます
  • リリースビルドとデバッグビルドの両方が同じキーストアを使用します
  • Google APIマネージャーで、「OAuth同意画面」が構成されています
  • 承認されたリダイレクトURIのドメインも確認しました
  • 念のため、FirebaseGoogleServices.jsonファイルを再ダウンロードしました
  • パッケージ名の問題はありません。実際、Firebase Analyticsは、このアプリで問題なく実行されています。
  • Playストア開発コンソールで、私のOAuthクライアントが[設定]-> [APIアクセス]に表示されます]
  • 私のFirebaseプロジェクトは、Playストア開発コンソールの[リンクされたアカウント]設定セクションにリンクされています
  • Googleのバックエンドがこれを設定するのに時間がかかるかどうかを確認するために、私は10時間待ちました

検索しやすくするために、タイトルのlogcatエラーメッセージの直後に、次のlogcatの出力が表示されます。

OAuth2関連の構成が間違っています。確認してください。詳細なエラー:INVALID_AUDIENCE

14
Justin

WebクライアントIDは、Playストアアカウントではなく、Firebaseと同じユーザーアカウントで生成する必要があります。私の場合、2つのアカウントは別々であり、Googleは情報を適切にリンクする代わりに、このエラーをスローします。 FirebaseアカウントはPlayストアアカウントにリンクされていますが、それは明らかにWebクライアントIDが共有されることを意味するものではありません。 API Managerアカウントのリンクなど、他のいくつかのソリューションを試しましたが、それも機能しませんでした。 FirebaseがAPIManagerアカウントで使用するのと同じプロジェクト内に、Firebaseアカウントと同じWebクライアントIDを作成する必要があります。

2
Justin

あなたの活動を実行する

GoogleApiClient.OnConnectionFailedListener

これらのプライベート変数を設定します

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

Googleサインインの設定

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();
}

すべてのポイントでログを保持します。作成したリストと適切に組み合わせてすべてのポイントに従えば、機能するはずです。

0

問題は、Google認証プロセスのclient_idにあります。現在のプロジェクトからファイルを削除してから、新しいインスタンスを追加します。今回はidに注意を払います。 Android-studioを使用してFirebaseの設定を生成します。複数のクライアントIDを持つプロジェクトが必要です。1つはAndroidアプリ、SHAを使用するためのものです。最も安全な方法は、Googleコンソールで現在のプロジェクトを削除してから、再作成することです。次に、 Android studio go tools => firebase次に、統合する設定を選択します。手動で追加することはお勧めしません。

0
Remario