9

Ho fornito l'opzione GoogleSignIn nella mia app.Ottenere 'E/TokenRequestor: hai errato configurazioni relative a OAuth2. Errore dettagliato: INVALID_AUDIENCE 'anche dopo aver fornito gli ID cliente accurati

Ecco il mio codice:

public class SignupActivity extends AppCompatActivity { 

    private static final int RC_SIGN_IN = 1; 
    GoogleApiClient mGoogleApiClient; 
    FirebaseAuth mAuth; 
    TextView appName; 
    ProgressDialog signinProgressDialog; 
    CoordinatorLayout coordinatorLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_signup); 
//  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
//  setSupportActionBar(toolbar); 

     signinProgressDialog = new ProgressDialog(SignupActivity.this); 

     coordinatorLayout = (CoordinatorLayout) findViewById(R.id.signupCoordinatorLayout); 

     // Configure Google Sign In 
     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.o_auth_client_id)) 
       .requestEmail() 
       .requestProfile() 
       .requestId() 
       .build(); 

     // Build a GoogleApiClient with access to the Google Sign-In API and the 
     // options specified by gso. 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this /* FragmentActivity */, new GoogleApiClient.OnConnectionFailedListener() { 
        @Override 
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

        } 
       } /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

     mAuth = FirebaseAuth.getInstance(); 

     findViewById(R.id.sign_in_button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (isNetworkAvailable()) { 
        signinProgressDialog.setMessage("Signing in..."); 
        signinProgressDialog.show(); 
        signIn(); 
       } else { 
        Snackbar snackbar = Snackbar 
          .make(coordinatorLayout, "No internet connection!", Snackbar.LENGTH_LONG); 
        snackbar.show(); 
        signinProgressDialog.dismiss(); 
       } 
      } 
     }); 

    } 

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

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
     if (requestCode == RC_SIGN_IN) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       // Google Sign In was successful, authenticate with Firebase 
       GoogleSignInAccount account = result.getSignInAccount(); 
       firebaseAuthWithGoogle(account); 
      } else { 
       // Google Sign In failed, update UI appropriately 
       // ... 
       Snackbar snackbar = Snackbar 
         .make(coordinatorLayout, "Error signing in!", Snackbar.LENGTH_LONG); 
       snackbar.show(); 
       signinProgressDialog.dismiss(); 
      } 
     } 
    } 

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
     Log.d("firebaseAuthWithGoogle", "firebaseAuthWithGoogle:" + acct.getId()); 

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

         Intent mainActivityIntent = new Intent(SignupActivity.this, MainActivity.class); 
         mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
         startActivity(mainActivityIntent); 
         signinProgressDialog.dismiss(); 

         // 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("signin_unsuccessful", "signInWithCredential", task.getException()); 
          Toast.makeText(SignupActivity.this, "Authentication failed.", 
            Toast.LENGTH_SHORT).show(); 
          signinProgressDialog.dismiss(); 
         } 
         // ... 
        } 
       }); 
    } 

    @Override 
    public void onBackPressed() { 
     finish(); 
     super.onBackPressed(); 
    } 

    private boolean isNetworkAvailable() { 
     ConnectivityManager connectivityManager 
       = (ConnectivityManager) SignupActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
     return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
    } 
} 

Ho 2 ID client, uno è client Web e un altro è cliente Android.

Ho controllato i miei ID client con il mio file google-services.json e il mio progetto su console.developers.google.com Sono tutti corrispondenti.

Ma sto ancora ricevendo questo errore: E/TokenRequestor: You have wrong OAuth2 related configurations, please check. Detailed error: INVALID_AUDIENCE 06-27 12:40:14.651 4443-4484/? D/AuthAccountOperation: id token request failed.

quello che potrebbe essere la causa di questo errore?

È così che la mia app non è più collegata alla mia app sulla mia console o è qualcos'altro?

Per favore fatemi sapere.

+0

Stavo facendo l'accesso a Google utilizzando l'API di Google nella mia app Android. Supponendo che le tue configurazioni siano tutte spiegate come da documento google, ecco una cosa nuova che dovevo fare. Quando ho usato il mio codice, la funzionalità di accesso ha funzionato bene, ma quando il mio sviluppatore lo ha utilizzato ha affrontato questo problema, l'ho risolto usando lo stesso "debug.keystore" per il mio e il mio sviluppatore. Ha funzionato bene. – xrnd

+0

Fondamentalmente ciò avviene a causa di impronte digitali errate. verifica la tua impronta digitale con la console. – xrnd

+0

E come si fa a verificare? –

risposta

0

Se si desidera effettuare il login successo con account Google, si dovrebbe fare questi: 1.Upload un APK (ad esempio packageName è 'com.example.xxx' SHA1 & di chiavi è 'qwertyuiop ....') to google console di sviluppo, quindi ottieni l'ID cliente. 2.utilizzare l'ID cliente corretto appena ricevuto e firmare l'apk con il file di archivio di chiavi corretto che SHA1 è 'qwertyuiop ...'. In genere, è possibile farlo.

Ancora non riesco ad accedere con successo, uno dei passaggi sopra deve essere sbagliato, controllarlo passo dopo passo. Immagino che il file keystore possa essere sbagliato per il tuo debugMode.

+0

Penso che questo sia (nella migliore delle ipotesi) una ipotesi approssimativa sulla natura del problema; non vale una vera risposta; se mai, dovrebbe essere un commento. – GhostCat

+0

giudichi questo con indovinare? Ti rendi conto dei progressi di accesso di Google? SHA1 di keystore e nome del pacchetto sono preoccupati per questo. Se usa clientID e packageName corretti, allora dovrebbe controllare il suo keystore! – Yachao

+1

Come detto: questo renderebbe un commento "OK"; ma per una risposta, una dichiarazione di una sola frase semplicemente non funziona. Se migliori la tua risposta, non mi dispiace cambiare il mio "giudizio". – GhostCat

2

È necessario aggiungere l'impronta digitale SHA per ogni app Android nelle impostazioni del progetto. Se stai utilizzando Firebase, modifica il link sottostante con il nome del tuo progetto e aggiungi l'impronta digitale per la tua app.

https://console.firebase.google.com/project/{YOUR_PROJECT_NAME}/settings/general/ 
+0

già aggiunto ma non funzionante. Aiutatemi per favore –

+0

@NiravPatel Aggiungete i fingerprint dei certificati sia per i file di debug che per quelli di rilascio dei tasti. Ecco un [collegamento] (https://developers.google.com/android/guides/client-auth) dove trovare il file di battitura di debug. – abdllhbyrktr