# Configurar autenticación social

Guía para activar el inicio de sesión con Google, Apple y Facebook en tu proyecto.

---

## Google Sign-In

### Backend Firebase

La CLI se encarga de la configuración técnica automáticamente al generar el proyecto:
- Lee el `REVERSED_CLIENT_ID` del `GoogleService-Info.plist`
- Registra el URL scheme en `ios/Runner/Info.plist`
- Escribe `lib/google_auth_options.dart` con el Web Client ID
- Registra en Google Cloud los redirect URIs `firebaseapp.com` y `web.app` (`firebase deploy --only auth`)
- Ajusta `authDomain` en `firebase_options` a `TU_PROYECTO.web.app` (same-origin en Hosting por defecto; importante en el navegador embebido de la IDE)

**Proyecto existente (creado antes de CLI 1.71.4):** ejecuta `kasy oauth-web` en la carpeta del app. Registra los dos redirect URIs en Google Cloud (`firebase deploy --only auth`) y ajusta `authDomain`. Usa `--no-deploy` si solo quieres el patch local de `authDomain`.

**Lo que debes verificar una sola vez:**

1. [Firebase Console → Authentication → Sign-in method → Google](https://console.firebase.google.com/project/_/authentication/providers) → activar
2. La CLI agrega el SHA-1 del debug keystore automáticamente en Android. Si usas un equipo nuevo o un keystore diferente, verifica con:
```bash
kasy doctor
```

### Backend Supabase (sin companion Firebase)

El login con Google **no** necesita un companion Firebase. Push (FCM) es el único motivo para crear Firebase junto a Supabase.

**Modo Rápido pregunta:**
1. ¿Querés push? Si sí, la CLI crea companion Firebase (FCM gratis, sin Blaze) y lo explica con claridad.
2. ¿Querés Google? Con push: OAuth + SHA-1 Android se automatizan vía companion. Sin push: paste del Client ID/Secret (Web) + la CLI **imprime** el SHA-1 debug para que crees un client OAuth tipo Android en la Consola (eso **no** es automático sin companion).

**Lo que es automático con companion (push sí):**
- Proyecto FCM, mint OAuth Google, SHA-1 en la app Android de Firebase, provider en Supabase Auth
- **No creás un client OAuth tipo Android a mano:** Firebase + SHA-1 ya amarran el Google Sign-In nativo en Android. El client Android manual en la Consola solo entra en el camino **sin** companion (ahí la CLI imprime el SHA-1 para que lo pegues).

**Lo que NO es 100% automático (sé honesto):**
- Crear el client OAuth **Web** en Google Cloud Console (no hay API pública estable) cuando **no** hay companion
- Registrar SHA-1 en Android **sin** companion Firebase (la CLI extrae e imprime; vos lo pegás en un client Android)

**Checklist manual (sin companion):** ejecutá `kasy google` (imprime la guía) o `configure_google_login` en MCP (sin credenciales, devuelve los pasos).

1. **Proyecto GCP separado** (no es el proyecto Supabase). Reutilizá uno existente o creá en [console.cloud.google.com/projectcreate](https://console.cloud.google.com/projectcreate). Si "Ninguna organización" agota la cuota de proyectos, elegí otra org. Dentro de una org, la Consola puede **exigir vincular facturación** (regla de GCP, no de Supabase). Vincular facturación no significa que te cobren: OAuth en Testing no cobra.
2. **Branding / consentimiento OAuth** (Plataforma de autenticación → Empecemos): nombre de la app + correo de soporte → Público **Externo** → correo de contacto (escribilo y presioná **Enter** para confirmarlo en la lista) → aceptá la política → **Crear**.
3. **Client OAuth Web:** [Visión general de OAuth](https://console.cloud.google.com/auth/overview) → **Crear un cliente OAuth** → tipo **Aplicación web**.
4. En **Authorized redirect URIs**, agrega:
   `https://TU_PROJECT_REF.supabase.co/auth/v1/callback`
5. **Usuarios de prueba** (modo Testing): Público → agregá el Gmail que vas a usar para probar el login.
6. Copiá **Client ID** y **Client Secret** con el botón copiar del Console (texto plano, nunca captura). Un carácter mal se convierte en `401 invalid_client`. Luego ejecutá:
```bash
kasy google
```
   Esto escribe `lib/google_auth_options.dart`, activa el proveedor Google en Supabase Auth e imprime el SHA-1 Android.
7. (Opcional) Cliente OAuth iOS para Sign-In nativo; el comando pregunta o acepta `--ios-client-id`

Con MCP (`create_project`): Google viene activado por defecto (independiente del push). Con `push=true`, el companion puede mintar OAuth y registrar credenciales en Supabase Auth. Sin push, el scaffold incluye Google y el proveedor ya queda **Enabled** en Supabase Auth (como Apple); para Client ID/Secret, usá `configure_google_login` después (no preguntes Google en `create_project`).

### Backend API REST

El client puede recibir los IDs con `kasy google` (escribe `google_auth_options.dart`). El login social en el servidor queda a cargo de tu API (`UnimplementedError` en el template hasta que lo implementes).

---

## Apple Sign-In

Requiere cuenta de [Apple Developer](https://developer.apple.com) (de pago).

### Paso 1 — Activar capability en el Bundle ID

1. Abre [Identifiers](https://developer.apple.com/account/resources/identifiers/list)
2. Selecciona tu Bundle ID
3. Activa **Sign In with Apple** → Enable as a primary App ID → **Save**

### Paso 2 — Crear una clave

1. Abre [Keys](https://developer.apple.com/account/resources/authkeys/list)
2. Haz clic en **+** → escribe un nombre (ej: `Firebase Sign In with Apple`)
3. Activa **Sign In with Apple** → Configure → selecciona tu Bundle ID → Save
4. Regístrala → **descarga el archivo `.p8`** (solo se puede descargar una vez — guárdalo en un lugar seguro)
5. Anota el **Key ID** (ej: `6RR89XG535`)

### Paso 3 — Crear o editar el Services ID (web)

El login con Apple **en la web** usa un **Services ID** (`com.empresa.app.signin`). **No** es el mismo que el **App ID** de iOS (`com.empresa.app`). Si abres el identifier equivocado, el portal muestra error o **Configure** no guarda.

1. Abre [Identifiers](https://developer.apple.com/account/resources/identifiers/list) (**Certificates, Identifiers & Profiles** → **Identifiers**).
   Atajo directo a Services IDs: [lista de Services IDs](https://developer.apple.com/account/resources/identifiers/list/serviceId)
2. **Filtro (importante):** la página abre en **App IDs** (lista con `com.empresa.app`). En el dropdown superior derecho (**App IDs**), cambia a **Services IDs**. Solo después ves o creas `TU_BUNDLE_ID.signin`.
3. Si no existe: botón **+** → **Services IDs** → Continue
4. Rellena:
   - **Description**: `Firebase Sign In with Apple` (o nombre del app)
   - **Identifier**: `TU_BUNDLE_ID.signin` (ej: `com.empresa.app.signin`)
5. Regístralo → clic en el Services ID → activa **Sign In with Apple** → **Configure**
6. **Primary App ID**: tu Bundle ID (`com.empresa.app`)

**Domains y Return URLs dependen del backend:**

| Backend | Domains (sin `https://`, coma en una línea) | Return URLs (con `https://`, coma en una línea) |
| --- | --- | --- |
| **Firebase** | `TU_PROYECTO.firebaseapp.com, TU_PROYECTO.web.app` | `https://TU_PROYECTO.firebaseapp.com/__/auth/handler, https://TU_PROYECTO.web.app/__/auth/handler` |
| **Supabase** | `TU_PROJECT_REF.supabase.co` | `https://TU_PROJECT_REF.supabase.co/auth/v1/callback` |

> **Formato en el portal Apple:** Domains y Return URLs piden lista **separada por comas en una sola línea** (no una URL por línea). Líneas separadas generan *One or more domains are invalid* y **Next** queda deshabilitado.
>
> Firebase (ejemplo): `proyecto.firebaseapp.com, proyecto.web.app` y ambas URLs `__/auth/handler` en una línea.
>
> Supabase (ejemplo): `abcxyz.supabase.co` y `https://abcxyz.supabase.co/auth/v1/callback`

7. **Next** → **Done** → **Continue** → **Save**

### Paso 4 — Configurar en Firebase

1. Abre [Firebase Console → Authentication → Apple](https://console.firebase.google.com/project/_/authentication/providers)
2. Activa el proveedor Apple
3. Rellena en **Configuración del flujo de código OAuth**:
   - **Services ID**: el identifier del Paso 3 (ej: `com.empresa.app.signin`)
   - **Team ID**: encuéntralo en [Membership Details](https://developer.apple.com/account#MembershipDetailsCard)
   - **Key ID**: el Key ID del Paso 2
   - **Clave privada**: contenido completo del archivo `.p8`, incluyendo las líneas `-----BEGIN PRIVATE KEY-----` y `-----END PRIVATE KEY-----`
4. **Guardar**

### Paso 5 — Activar capability en Xcode

1. Abre `ios/Runner.xcworkspace` en Xcode
2. Target **Runner** → **Signing & Capabilities** → **+ Capability** → agrega **Sign In with Apple**

> **iOS / macOS**: el botón Apple aparece automáticamente tras los pasos anteriores.
>
> **Android**: el botón Apple queda oculto por defecto (necesita el flujo del Services ID de pago y aporta poco en Android para un SaaS). Déjalo oculto.
>
> **Web (Firebase)**: tras los Pasos 1 a 3, ejecuta `kasy apple-web` — escribe el Services ID + Team ID + Key ID + `.p8` en el proveedor Apple de Firebase y activa `withAppleWebSignin` (que viene `false`). El Services ID necesita **ambos** dominios y **ambas** Return URLs (`firebaseapp.com` y `web.app`). Firebase vuelve a firmar el secret solo (no expira). Antes de ejecutar el comando, el botón Apple ya aparece en cualquier navegador en dispositivo Apple (iOS, iPadOS, macOS) con un toast de configuración.
>
> **Web (Supabase)**: mismos pasos en Apple Developer, luego ejecuta `kasy apple-web` — firma el client secret y lo guarda en Supabase (expira cada ~6 meses; vuelve a ejecutar para renovar). En el Services ID, **Domain**: `TU_PROJECT_REF.supabase.co` y **Return URL**: `https://TU_PROJECT_REF.supabase.co/auth/v1/callback` (coma en una sola línea si agregas más). Antes de configurar, el botón Apple aparece en cualquier navegador en dispositivo Apple (iOS, iPadOS, macOS) con un toast de configuración.

---

## Facebook Sign-In

Requiere cuenta en [Meta for Developers](https://developers.facebook.com).

> **Atajo:** el comando `kasy facebook` automatiza escribir las credenciales (Info.plist, strings.xml y el proveedor en Firebase/Supabase) y abre el panel de Meta. Los pasos de abajo son lo que haces en Meta (manual, sin API).

### Paso 1 — Crear una app en Meta

1. Abre [Meta for Developers → My Apps](https://developers.facebook.com/apps)
2. Haz clic en **Create App** → selecciona **Consumer** → Next
3. Ingresa el nombre de la app → Create App
4. En el panel de la app, anota el **App ID** y el **Client Token** (Settings → Advanced → Client Token)

### Paso 2 — Activar Facebook Login

1. En el panel de la app Meta → Add Product → **Facebook Login** → Set Up → iOS/Android según corresponda
2. iOS: proporciona el Bundle ID de tu app

### Paso 3 — iOS: actualizar Info.plist

Edita `ios/Runner/Info.plist` y reemplaza los placeholders:

```xml
<key>FacebookAppID</key>
<string>TU_APP_ID</string>
<key>FacebookClientToken</key>
<string>TU_CLIENT_TOKEN</string>
<key>FacebookDisplayName</key>
<string>Nombre de tu app</string>
```

Y el URL scheme (dentro de `CFBundleURLTypes`):
```xml
<string>fbTU_APP_ID</string>
```

### Paso 4 — Android: actualizar strings.xml

Edita `android/app/src/main/res/values/strings.xml` y reemplaza los placeholders:

```xml
<string name="facebook_app_id">TU_APP_ID</string>
<string name="facebook_client_token">TU_CLIENT_TOKEN</string>
```

### Paso 5 — Web: agregar dominio en Meta

1. En el panel de la app Meta → Facebook Login → Settings
2. En **Valid OAuth Redirect URIs**, agrega:
   - **Backend Firebase** (agrega ambas):
     - `https://TU_PROYECTO.firebaseapp.com/__/auth/handler`
     - `https://TU_PROYECTO.web.app/__/auth/handler`
   - **Backend Supabase**: `https://TU_PROYECTO.supabase.co/auth/v1/callback`
3. En **Allowed Domains for the JavaScript SDK**, agrega los dominios de tu app (`firebaseapp.com` y `web.app` en Firebase; tu host web en Supabase)

Luego ejecuta `kasy facebook` para escribir los archivos nativos, activar el proveedor y encender `withFacebookWebSignin`. Antes de configurar, el botón Facebook ya aparece en la web con un toast de configuración.

---

## Supabase

Para proyectos con backend Supabase, la configuración del lado de Apple y Meta es idéntica. Lo que cambia es dónde registrar las credenciales:

| Proveedor | Dónde configurar |
|-----------|-----------------|
| Google | Supabase Dashboard → Auth → Providers → Google |
| Apple | Supabase Dashboard → Auth → Providers → Apple (Services ID obligatorio) |
| Facebook | Supabase Dashboard → Auth → Providers → Facebook |

Para Apple con Supabase, el **Return URL** del Services ID debe ser:
```
https://TU_PROYECTO.supabase.co/auth/v1/callback
```

### Web en producción

El deploy automático de Kasy (`kasy new` / `kasy deploy`) solo configura `http://localhost:5555` en la lista de URIs permitidas (`uri_allow_list`) de Supabase Auth. Es el puerto que usa `kasy run --web`.

Antes de publicar la web en producción:

1. Abre el panel de Supabase → **Authentication → URL Configuration**
2. Agrega tu dominio real en **Site URL** y **Redirect URLs** (ej.: `https://tusitio.com` y `https://tusitio.com/**`)
3. Mantén también `http://localhost:5555` si sigues probando en local

Sin esto, el login social (Google, Apple, Facebook) redirige al dominio equivocado o falla en silencio después del OAuth.

### Verificar usuarios anónimos en el panel

Después del onboarding o de **Continuar sin cuenta**, el usuario existe en `auth.users` y en `public.users` (trigger `handle_new_user`).

En **Authentication → Users**, los anónimos no tienen email. Si el desplegable de búsqueda está en **Email address**, la lista parece vacía o solo muestra Google/Apple.

1. Cambia el desplegable a **Unified search** (o **User ID**)
2. Limpia la barra de búsqueda
3. Busca filas con email **-** y provider **Anonymous**
4. El pie **Total: X users** puede ser mayor que las filas visibles
5. Copia el UID de **Table Editor → users** y búscalo en Auth

Más detalles: [Troubleshooting](https://kasy.dev/docs/referencia/troubleshooting) (sección *Usuario anónimo creado pero no aparece en Supabase Auth*).

### ¿Por qué la Consola de Firebase muestra "Authentication" en mi proyecto Supabase?

**Solo si existe companion Firebase** (activaste **push** en Rápido, Avanzado o con `kasy add notifications`). Sin push **no** hay proyecto Firebase acompañante y esta sección no aplica.

Cuando el companion existe: login, sesiones y usuarios de la app viven **solo en Supabase Auth**. El Firebase acompañante **no** es el backend de login.

**Qué hace de verdad el Firebase acompañante:**
- **Push (FCM)** y configs nativas (`google-services.json` / `GoogleService-Info.plist`)
- **Remote Config** (cuando se usa)
- Si Google también está activo **con** push: **automatización OAuth** (mint Client ID/Secret + SHA-1) y registro en Supabase Auth; Google en Firebase Auth es solo temporal y luego se desactiva

**Sin push:** Google = OAuth Web en la Consola + `kasy google` (sin Identity Platform / sin companion).

La app sigue el [flujo oficial de Supabase para Flutter](https://supabase.com/docs/guides/auth/social-login/auth-google?platform=flutter): **web** usa `signInWithOAuth`, **iOS/Android** usan `google_sign_in` + `signInWithIdToken`.

**¿Esto genera algún costo extra?** No. FCM y los proveedores estándar de Firebase Auth son gratuitos; el companion solo existe cuando hay push.
