signinwith - Error de autenticación de Android: "Falló GetToken con el código de estado: INVALID_AUDIENCE"
firebase console (3)
El problema es con su client_id, para el proceso de autenticación de google. Borre el archivo del proyecto actual. Luego agregue una nueva instancia. Esta vez prestando especial atención a la identificación. usa android-studio para generar las configuraciones para firebase. Tienes que tener un proyecto con varios ID de cliente Uno es para tu aplicación de Android, con SHA. La apuesta más segura es borrar tu proyecto actual en la consola de google. Luego volver a crearlo. Luego, en el estudio de Android, ve a tools => firebase y luego elige la configuración que deseas integrar. No recomiendo la adición manual.
Hay un par de preguntas sobre este código de error impreciso, pero ninguno ha resuelto este problema, así que lo intentaré de nuevo. Primero, aquí está el código repetitivo para iniciar sesión.
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);
Con este código, obtengo un diálogo y puedo seleccionar la cuenta de usuario adecuada. ¡Hurra! Sin embargo, luego obtengo un código cancelado en ActivityResult, así que reviso Logcat y veo el mensaje de error en el título. Luego busco a otras personas con este problema, pero no he podido averiguar cuál es el problema en mi caso.
Entonces, verifiquemos los problemas comunes de otras publicaciones.
- La consola de Firebase muestra que mi aplicación está registrada con las huellas digitales SHA-1 y SHA-256 correctas
- Las compilaciones de versión y depuración usan el mismo almacén de claves
- En el administrador de la API de Google, mi "pantalla de consentimiento de OAuth" está configurada
- También verifiqué el dominio de los URI de redirección autorizados
- He vuelto a descargar el archivo Firebase GoogleServices.json, solo para estar seguro
- No hay problemas con el nombre del paquete. De hecho, Firebase Analytics ha estado funcionando bien en esta aplicación en estado salvaje
- En la consola de desarrollo de Play Store, mi cliente OAuth aparece en "Configuración-> acceso a la API"
- Mi proyecto de Firebase está vinculado en la sección de configuración de "Cuentas vinculadas" de la consola de desarrollo de Play Store
- He esperado 10 horas, solo para ver si el backend de Google tomaría tiempo para configurar esto
Para la búsqueda, justo después del mensaje de error de logcat en el título, obtengo la siguiente impresión de logcat.
Tiene configuraciones incorrectas relacionadas con OAuth2, verifique. Error detallado: INVALID_AUDIENCE
Su ID de cliente web debe generarse en la misma cuenta de usuario que Firebase, no en su cuenta de Play Store. En mi caso, las dos cuentas están separadas, y Google arroja este error en lugar de vincular la información correctamente. Mi cuenta de Firebase está vinculada a mi cuenta de Play Store, pero aparentemente eso no significa que se comparta la ID del cliente web. Probé otras soluciones, como vincular las cuentas de API Manager, y tampoco funcionó. Debes crear el ID del cliente web dentro del mismo proyecto que Firebase usa en la cuenta del Administrador de API que es lo mismo que tu cuenta de Firebase.
Implementa tu actividad
GoogleApiClient.OnConnectionFailedListener
Configura estas variables privadas
private GoogleApiClient mGoogleApiClient;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth mFirebaseAuth;
private static final int RC_SIGN_IN = 9001;
Configurar Google Sign In
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();
Inicializa 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()
}
Iniciar sesión Método
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étodo de cerrar sesión
private void signOut() {
Auth.GoogleSignInApi.signOut(mGoogleApiClient).
setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(@NonNull Status status) {
}
});
mFirebaseAuth.signOut();
}
Mantenga los registros en todo punto. Si siguió todos los puntos correctamente, combinar con la lista que hizo debería funcionar.