web-dev-qa-db-fra.com

Erreur d'authentification Android: "GetToken a échoué avec le code d'état: INVALID_AUDIENCE"

Il y a déjà quelques questions sur ce code d'erreur vague, mais aucune n'a résolu ce problème pour moi, alors je vais réessayer. Tout d’abord, voici le code général pour la connexion.

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

Avec ce code, je reçois une boîte de dialogue et peux sélectionner le compte d'utilisateur approprié. Yay! Cependant, je reçois alors un code annulé dans onActivityResult, je vérifie donc logcat et remarque le message d'erreur dans le titre. Ensuite, je recherche d’autres personnes atteintes de ce problème, mais je n’ai pas été en mesure de cerner le problème dans mon cas.

Nous allons donc vérifier les problèmes courants dans d’autres publications.

  • La console Firebase indique que mon application est enregistrée avec les empreintes digitales SHA-1 et SHA-256 correctes.
  • Les versions release et debug utilisent le même magasin de clés
  • Dans Google API Manager, mon "écran de consentement OAuth" est configuré.
  • J'ai également vérifié le domaine des URI de redirection autorisées.
  • J'ai retéléchargé le fichier GoogleServices.json de Firebase, juste pour être sûr
  • Il n'y a pas de problèmes de nom de paquet. En fait, Firebase Analytics fonctionne parfaitement sur cette application à l'état sauvage
  • Dans la console de développement de Play Store, mon client OAuth apparaît dans "Paramètres-> Accès à l'API".
  • Mon projet Firebase est lié dans la section des paramètres "Comptes liés" de la console de développement du Play Store.
  • J'ai attendu 10 heures, juste pour voir si le backend de Google prendrait du temps à mettre en place cela

Pour la recherche, juste après le message d'erreur logcat dans le titre, j'obtiens l'impression logcat suivante.

Vous avez une mauvaise configuration liée à OAuth2, veuillez vérifier. Détaillé erreur: INVALID_AUDIENCE

14
Justin

Votre ID client Web doit être généré dans le même compte d'utilisateur que Firebase, pas votre compte Play Store. Dans mon cas, les deux comptes sont séparés et Google renvoie cette erreur au lieu de lier correctement les informations. Mon compte Firebase est lié à mon compte Play Store mais cela ne signifie apparemment pas que l'ID du client Web sera partagé. J'ai essayé d'autres solutions telles que la liaison des comptes API Manager, mais cela n'a pas fonctionné non plus. Vous devez créer l'ID de client Web dans le même projet que Firebase utilise dans le compte API Manager identique à votre compte Firebase.

1
Justin

Mettre en œuvre votre activité

GoogleApiClient.OnConnectionFailedListener

Configurez ces variables privées

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

Configurer la connexion 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();

Initialise 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()

    }

Méthode de connexion

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

Méthode de déconnexion

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

Conservez les journaux à un point fixe… si vous avez suivi correctement tous les points, en vous associant à la liste que vous avez établie.

0

Le problème vient de votre client_id, pour google auth process. Supprimez le fichier du projet actuel. Ajoutez ensuite une nouvelle instance. Cette fois en accordant une attention particulière à l'identifiant. utilisez Android-studio pour générer les paramètres de firebase . Vous devez avoir un projet avec plusieurs identifiants client Un pour votre application Android, avec le SHA. Le pari le plus sûr est de supprimer votre projet actuel dans la console Google. Puis, recréez-le. Ensuite, dans Android studio, allez dans outils => firebase, puis choisissez les paramètres que vous souhaitez intégrer. Je ne recommande pas l'addition manuelle.

0
Remario