user: ¿Cómo puedo conectar mi aplicación de Android programada con Kotlin y Jetpack Compose con la api de Firebase para autenticar un usuario con Google Auth?

assistant: Para conectar tu aplicación de Android desarrollada con Kotlin y Jetpack Compose a Firebase y autenticar usuarios con Google Auth, sigue estos pasos:



user: # 1. Configurar Firebase en tu proyecto de Android

1. Ve al sitio web de [Firebase](https://firebase.google.com/). y crea una cuenta o inicia sesión.
2. Crea un nuevo proyecto de Firebase y sigue las instrucciones.
3. Agrega Firebase a tu proyecto de Android siguiendo las instrucciones en la [documentación oficial](https://firebase.google.com/docs/android/setup).
4. Asegúrate de agregar el archivo `google-services.json` a tu proyecto.



assistant: # 2. Agregar las dependencias de Firebase y Google Auth

Agrega las dependencias de Firebase y Google Auth en el archivo `build.gradle` de tu módulo `app`:

```gradle
dependencies {
    // ...
    implementation 'com.google.firebase:firebase-auth:21.0.1'
    implementation 'com.google.android.gms:play-services-auth:19.2.0'
}
```

No olvides sincronizar tu proyecto con los archivos de Gradle.



user: # 3. Configurar Google Auth en Firebase

1. Ve a la consola de Firebase, selecciona tu proyecto y ve a "Authentication" en el menú lateral.
2. Ve a la pestaña "Método de inicio de sesión" y habilita "Google" como método de inicio de sesión.
3. Sigue las instrucciones para configurar tu proyecto de Google Cloud y obtener la clave de cliente de OAuth 2.0.



assistant: # 4. Implementar la autenticación con Google Auth y Firebase en tu aplicación

En tu aplicación de Android, crea una clase para manejar la autenticación con Firebase y Google Auth. Puedes llamarla `AuthenticationManager`. Aquí tienes un ejemplo básico:

```kotlin
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.api.ApiException
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.GoogleAuthProvider

class AuthenticationManager(private val context: Context) {
    private val firebaseAuth = FirebaseAuth.getInstance()
    private val googleSignInClient: GoogleSignInClient

    init {
        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(context.getString(R.string.default_web_client_id))
            .requestEmail()
            .build()

        googleSignInClient = GoogleSignIn.getClient(context, gso)
    }

    val isUserSignedIn: Boolean
        get() = firebaseAuth.currentUser != null

    fun signInWithGoogle(activityLauncher: ActivityResultLauncher<Intent>) {
        val signInIntent = googleSignInClient.signInIntent
        activityLauncher.launch(signInIntent)
    }

    fun handleSignInResult(data: Intent?, onSuccess: () -> Unit, onFailure: (String) -> Unit) {
        try {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            val account = task.getResult(ApiException::class.java)

            account?.let {
                firebaseAuthWithGoogle(it, onSuccess, onFailure)
            } ?: onFailure("Error al iniciar sesión con Google")
        } catch (e: ApiException) {
            onFailure("Error al iniciar sesión con Google: ${e.message}")
        }
    }

    private fun firebaseAuthWithGoogle(account: GoogleSignInAccount, onSuccess: () -> Unit, onFailure: (String) -> Unit) {
        val credential = GoogleAuthProvider.getCredential(account.idToken, null)
        firebaseAuth.signInWithCredential(credential).addOnCompleteListener { task ->
            if (task.isSuccessful) {
                onSuccess()
            } else {
                onFailure("Error al iniciar sesión con Firebase: ${task.exception?.message}")
            }
        }
    }

    fun signOut(onSuccess: () -> Unit) {
        firebaseAuth.signOut()
        googleSignInClient.signOut().addOnCompleteListener {
            onSuccess()
        }
    }
}

```