Firebase: Login Google en Android

Guía, tutorial para implementar la autenticación, login con Google en Firebase en una aplicación Android. Obtenemos la información del usuario directamente desde Firebase, nombre, correo, fotografía.

Requisitos

Configuración

build.gradle del módulo

compile 'com.google.firebase:firebase-auth:9.8.0'  

Las versiones pueden cambiar rápidamente, se debe considerar usar la misma versión que play-services-auth

Implementación

FirebaseAuth & Listener

FirebaseAuth.AuthStateListener es el oyente que se encarga de avisarnos cuando estamos autenticados o no.

  • Atributos en la Activity que se necesite manejar la autenticación
private FirebaseAuth firebaseAuth;  
private FirebaseAuth.AuthStateListener firebaseAuthListener;  
  • Inicialización en el método onCreate()
firebaseAuth = FirebaseAuth.getInstance();  
firebaseAuthListener = new FirebaseAuth.AuthStateListener() {  
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            goMainScreen();
        }
    }
};
  • Empezar a escuchar en el método onStart() de la Activity
firebaseAuth.addAuthStateListener(firebaseAuthListener);  
  • Terminar de escuchar en el método onStop() de la Activity
if (firebaseAuthListener != null) {  
    firebaseAuth.removeAuthStateListener(firebaseAuthListener);
}

Modificaciones

  • Adición del método requestIdToken() al GoogleSignInOptions
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)  
    .requestIdToken(getString(R.string.default_web_client_id))
    .requestEmail()
    .build();
  • Método de autenticación con Firebase
private void firebaseAuthWithGoogle(GoogleSignInAccount signInAccount) {  
    //...
    AuthCredential credential = GoogleAuthProvider.getCredential(signInAccount.getIdToken(), null);
    firebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    //...
                    if (!task.isSuccessful()) {
                        Toast.makeText(getApplicationContext(), "Authentication failed.", Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

Llamado luego de que la autenticación con Google fue exitosa.

firebaseAuthWithGoogle(result.getSignInAccount());  

Información del usuario

Se puede acceder al usuario actual desde cualquier parte de nuestra aplicación mediante el método getCurrentUser() del FirebaseAuth.

Si el método getCurrentUser() es null nadie se autenticó en la aplicación.

FirebaseUser user = firebaseAuth.getCurrentUser();  
if (user != null) {  
    nameTextView.setText(user.getDisplayName());
    emailTextView.setText(user.getEmail());
    idTextView.setText(user.getUid());
    Glide.with(getApplicationContext()).load(user.getPhotoUrl()).into(photoImageView);
} else {
    goLogInScreen();
}

Cerrar sesión y revocar acceso

Basta con usar el método signOut() del FirebaseAuth en cualquier parte de nuestra aplicación seguida del cierre de sesión o revoco de acceso de Google.

public void logOut(View view) {  
    firebaseAuth.signOut();

    // Sign Out Google...
}
public void revoke(View view) {  
    firebaseAuth.signOut();

    // Revoke Access Google...
}

Código

Cual duda o consulta pueden dejarla en los comentarios.

Daniel Alvarez

Software engineer, developer and producer of native mobile applications for Android and iOS, Angular, Firebase. Teacher. Speaker. Creating bots.