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.
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
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.
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.
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.