# Configurar autenticação social

Guia para ativar login com Google, Apple e Facebook no seu projeto.

---

## Google Sign-In

### Backend Firebase

A CLI já faz a parte técnica automaticamente ao gerar o projeto:
- Lê o `REVERSED_CLIENT_ID` do `GoogleService-Info.plist`
- Registra o URL scheme no `ios/Runner/Info.plist`
- Grava o `lib/google_auth_options.dart` com o Web Client ID
- Registra no Google Cloud os redirect URIs `firebaseapp.com` e `web.app` (`firebase deploy --only auth`)
- Ajusta `authDomain` em `firebase_options` para `SEU_PROJETO.web.app` (same-origin no Hosting padrão; importante no navegador embutido da IDE)

**Projeto já existente (criado antes da CLI 1.71.4):** rode `kasy oauth-web` na pasta do app. Ele registra os dois redirect URIs no Google Cloud (`firebase deploy --only auth`) e ajusta o `authDomain`. Use `--no-deploy` se só quiser patch local do `authDomain`.

**O que você precisa verificar uma única vez:**

1. [Firebase Console → Authentication → Sign-in method → Google](https://console.firebase.google.com/project/_/authentication/providers) → ativar
2. A CLI já adiciona o SHA-1 do debug keystore automaticamente no Android. Se usar um computador novo ou keystore diferente, verifique com:
```bash
kasy doctor
```

### Backend Supabase (sem projeto Firebase)

O login com Google **não** precisa de companion Firebase. Push (FCM) é o único motivo de criar Firebase no Supabase.

**Modo Rápido pergunta:**
1. Quer push? Se sim, a CLI cria companion Firebase (FCM gratuito, sem Blaze) e explica isso com clareza.
2. Quer Google? Com push: OAuth + SHA-1 Android são automatizados via companion. Sem push: paste do Client ID/Secret (Web) + a CLI **imprime** o SHA-1 debug para você criar um client OAuth tipo Android no Console (isso **não** é automático sem companion).

**O que é automático com companion (push sim):**
- Projeto FCM, mint OAuth Google, SHA-1 no app Android do Firebase, provider no Supabase Auth
- **Você não cria client OAuth tipo Android na mão:** o Firebase + SHA-1 já amarram o Google Sign-In nativo no Android. Client Android manual no Console só entra no caminho **sem** companion (aí a CLI imprime o SHA-1 pra você colar).

**O que NÃO é 100% automático (seja honesto):**
- Criar o OAuth client **Web** no Google Cloud Console (não há API pública estável) quando **não** há companion
- Registrar SHA-1 no Android **sem** companion Firebase (a CLI extrai e imprime; você cola no client Android)

**Checklist manual (sem companion):** use `kasy google` (imprime o guia) ou `configure_google_login` no MCP (sem credenciais, devolve os passos).

1. **Projeto GCP separado** (não é o projeto Supabase). Reutilize um existente ou crie em [console.cloud.google.com/projectcreate](https://console.cloud.google.com/projectcreate). Se "Nenhuma organização" estourar a cota de projetos, escolha outra organização. Dentro de org, o Console pode **obrigar vincular faturamento** (regra do GCP, não do Supabase). Vincular faturamento ≠ pagar: OAuth em Testing não cobra.
2. **Branding / consentimento OAuth** (Plataforma de autenticação → Vamos começar): nome do app + e-mail de suporte → Público **Externo** → e-mail de contato (digite e pressione **Enter** para confirmar na lista) → aceite a política → **Criar**.
3. **Client OAuth Web:** [Visão geral de OAuth](https://console.cloud.google.com/auth/overview) → **Criar um cliente OAuth** → tipo **Aplicativo da Web**.
4. Em **Authorized redirect URIs**, adicione:
   `https://SEU_PROJECT_REF.supabase.co/auth/v1/callback`
5. **Usuários de teste** (modo Testing): Público → adicione o Gmail que vai testar o login.
6. Copie **Client ID** e **Client Secret** com o botão copiar do Console (texto puro, nunca screenshot). Um caractere errado vira `401 invalid_client`. Depois rode:
```bash
kasy google
```
   Isso grava `lib/google_auth_options.dart`, ativa o provedor Google no Supabase Auth e imprime o SHA-1 Android.
7. (Opcional) Client OAuth iOS para login nativo no iPhone; o comando pergunta ou aceita `--ios-client-id`

Com MCP (`create_project`): Google vem ligado por padrão (independente do push). Com `push=true`, o companion pode mintar OAuth e registrar credenciais no Supabase Auth. Sem push, o scaffold inclui Google e o provedor já fica **Enabled** no Supabase Auth (como Apple); para Client ID/Secret, use `configure_google_login` depois (não pergunte Google no `create_project`).

### Backend API REST

O client pode receber os IDs via `kasy google` (grava `google_auth_options.dart`). O login social no servidor fica a cargo da sua API (`UnimplementedError` no template até você implementar).

---

## Apple Sign-In

Requer conta [Apple Developer](https://developer.apple.com) (paga).

### Passo 1 — Ativar capability no Bundle ID

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

### Passo 2 — Criar chave

1. Abra [Keys](https://developer.apple.com/account/resources/authkeys/list)
2. Clique em **+** → dê um nome (ex: `Firebase Sign In with Apple`)
3. Ative **Sign In with Apple** → Configure → selecione seu Bundle ID → Save
4. Registre → **baixe o `.p8`** (só é possível baixar uma vez — guarde em lugar seguro)
5. Anote o **Key ID** (ex: `6RR89XG535`)

### Passo 3 — Criar ou editar o Services ID (web)

O login Apple **na web** usa um **Services ID** (`com.empresa.app.signin`). **Não** é o mesmo que o **App ID** do iOS (`com.empresa.app`). Se você abrir o identifier errado, o portal mostra erro ou o **Configure** não salva.

1. Abra [Identifiers](https://developer.apple.com/account/resources/identifiers/list) (menu **Certificates, Identifiers & Profiles** → **Identifiers**).
   Atalho direto para Services IDs: [lista de Services IDs](https://developer.apple.com/account/resources/identifiers/list/serviceId)
2. **Filtro (importante):** a página abre em **App IDs** (lista com `com.empresa.app`). No canto superior direito da tabela, abra o dropdown (**App IDs**) e mude para **Services IDs**. Só depois você vê ou cria o identifier `SEU_BUNDLE_ID.signin`.
3. Se ainda não existe: botão **+** → marque **Services IDs** → Continue
4. Preencha:
   - **Description**: `Firebase Sign In with Apple` (ou nome do app)
   - **Identifier**: `SEU_BUNDLE_ID.signin` (ex: `com.empresa.app.signin`)
5. Registre → clique no Services ID → marque **Sign In with Apple** → **Configure**
6. **Primary App ID**: seu Bundle ID (`com.empresa.app`)

**Domains e Return URLs dependem do backend:**

| Backend | Domains (sem `https://`, vírgula na mesma linha) | Return URLs (com `https://`, vírgula na mesma linha) |
| --- | --- | --- |
| **Firebase** | `SEU_PROJETO.firebaseapp.com, SEU_PROJETO.web.app` | `https://SEU_PROJETO.firebaseapp.com/__/auth/handler, https://SEU_PROJETO.web.app/__/auth/handler` |
| **Supabase** | `SEU_PROJECT_REF.supabase.co` | `https://SEU_PROJECT_REF.supabase.co/auth/v1/callback` |

> **Formato no portal Apple:** Domains e Return URLs pedem lista **separada por vírgula em uma linha** (não use uma URL por linha). Linhas separadas no textarea geram *One or more domains are invalid* e o **Next** fica desabilitado.
>
> Firebase (exemplo): `projeto.firebaseapp.com, projeto.web.app` e `https://projeto.firebaseapp.com/__/auth/handler, https://projeto.web.app/__/auth/handler`
>
> Supabase (exemplo): `abcxyz.supabase.co` e `https://abcxyz.supabase.co/auth/v1/callback`

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

### Passo 4 — Configurar no Firebase

1. Abra [Firebase Console → Authentication → Apple](https://console.firebase.google.com/project/_/authentication/providers)
2. Ative o provedor Apple
3. Preencha em **Configuração do fluxo de código OAuth**:
   - **Services ID**: o identifier do Passo 3 (ex: `com.empresa.app.signin`)
   - **Team ID**: encontrado em [Membership Details](https://developer.apple.com/account#MembershipDetailsCard)
   - **ID da chave**: o Key ID do Passo 2
   - **Chave privada**: conteúdo completo do arquivo `.p8`, incluindo as linhas `-----BEGIN PRIVATE KEY-----` e `-----END PRIVATE KEY-----`
4. **Salvar**

### Passo 5 — Ativar capability no Xcode

1. Abra `ios/Runner.xcworkspace` no Xcode
2. Target **Runner** → **Signing & Capabilities** → **+ Capability** → adicione **Sign In with Apple**

> **iOS / macOS**: o botão Apple aparece automaticamente depois dos passos acima.
>
> **Android**: o botão Apple fica escondido por padrão (exige o fluxo do Services ID pago e agrega pouco no Android para um SaaS). Deixe escondido.
>
> **Web (Firebase)**: depois dos Passos 1 a 3, rode `kasy apple-web` — ele grava o Services ID + Team ID + Key ID + `.p8` no provedor Apple do Firebase e liga `withAppleWebSignin` (que nasce `false`). O Services ID precisa dos **dois** domínios e **duas** Return URLs (`firebaseapp.com` e `web.app`). O Firebase re-assina o secret sozinho (não expira). Antes de rodar o comando, o botão Apple já aparece em qualquer navegador em dispositivo Apple (iOS, iPadOS, macOS) com um toast de configuração.
>
> **Web (Supabase)**: mesmos passos na Apple Developer, depois rode `kasy apple-web` — ele assina o client secret e grava no Supabase (expira a cada ~6 meses; rode de novo pra renovar). No Services ID, **Domain**: `SEU_PROJECT_REF.supabase.co` e **Return URL** (vírgula se houver mais de uma): `https://SEU_PROJECT_REF.supabase.co/auth/v1/callback`. Antes de configurar, o botão Apple já aparece em qualquer navegador em dispositivo Apple (iOS, iPadOS, macOS) com um toast de configuração.

---

## Facebook Sign-In

Requer conta no [Meta for Developers](https://developers.facebook.com).

> **Atalho:** o comando `kasy facebook` automatiza a parte de gravar as credenciais (Info.plist, strings.xml e o provedor no Firebase/Supabase) e abre o painel da Meta. Os passos abaixo são o que você faz na Meta (manual, sem API).

### Passo 1 — Criar app no Meta

1. Abra [Meta for Developers → My Apps](https://developers.facebook.com/apps)
2. Clique em **Create App** → selecione **Consumer** → Next
3. Preencha o nome do app → Create App
4. No painel do app, anote o **App ID** e o **Client Token** (Settings → Advanced → Client Token)

### Passo 2 — Ativar Facebook Login

1. No painel do app Meta → Add Product → **Facebook Login** → Set Up → iOS/Android conforme necessário
2. iOS: informe o Bundle ID do seu app

### Passo 3 — iOS: atualizar Info.plist

Edite `ios/Runner/Info.plist` e substitua os placeholders:

```xml
<key>FacebookAppID</key>
<string>SEU_APP_ID</string>
<key>FacebookClientToken</key>
<string>SEU_CLIENT_TOKEN</string>
<key>FacebookDisplayName</key>
<string>Nome do seu app</string>
```

E o URL scheme (dentro de `CFBundleURLTypes`):
```xml
<string>fbSEU_APP_ID</string>
```

### Passo 4 — Android: atualizar strings.xml

Edite `android/app/src/main/res/values/strings.xml` e substitua os placeholders:

```xml
<string name="facebook_app_id">SEU_APP_ID</string>
<string name="facebook_client_token">SEU_CLIENT_TOKEN</string>
```

### Passo 5 — Web: adicionar domínio no Meta

1. No painel do app Meta → Facebook Login → Settings
2. Em **Valid OAuth Redirect URIs**, adicione:
   - **Backend Firebase** (adicione as duas):
     - `https://SEU_PROJETO.firebaseapp.com/__/auth/handler`
     - `https://SEU_PROJETO.web.app/__/auth/handler`
   - **Backend Supabase**: `https://SEU_PROJETO.supabase.co/auth/v1/callback`
3. Em **Allowed Domains for the JavaScript SDK**, adicione o domínio do seu app web

Depois rode `kasy facebook` para gravar os arquivos nativos, ligar o provedor e ativar `withFacebookWebSignin`. Antes de configurar, o botão Facebook já aparece na web com um toast de configuração.

---

## Supabase

Para projetos com backend Supabase, a configuração do lado da Apple e do Meta é idêntica. O que muda é onde cadastrar as credenciais:

| Provedor | Onde configurar |
|----------|----------------|
| Google | Supabase Dashboard → Auth → Providers → Google |
| Apple | Supabase Dashboard → Auth → Providers → Apple (Services ID obrigatório) |
| Facebook | Supabase Dashboard → Auth → Providers → Facebook |

No Apple com Supabase, o **Return URL** do Services ID deve ser:
```
https://SEU_PROJETO.supabase.co/auth/v1/callback
```

### Web em produção

O deploy automático da Kasy (`kasy new` / `kasy deploy`) configura só `http://localhost:5555` na lista de URIs permitidas (`uri_allow_list`) do Supabase Auth. É a porta que o `kasy run --web` usa.

Antes de publicar a web em produção:

1. Abra o painel do Supabase → **Authentication → URL Configuration**
2. Adicione seu domínio real em **Site URL** e **Redirect URLs** (ex.: `https://seusite.com` e `https://seusite.com/**`)
3. Se ainda testar localmente, mantenha também `http://localhost:5555`

Sem isso, o login social (Google, Apple, Facebook) redireciona pro domínio errado ou falha silenciosamente após o OAuth.

### Conferir usuários anônimos no painel

Depois do onboarding ou de **Continuar sem conta**, o usuário aparece em `auth.users` e em `public.users` (trigger `handle_new_user`).

No **Authentication → Users**, anônimos não têm e-mail. Se o dropdown da busca estiver em **Email address**, a lista parece vazia ou só mostra Google/Apple.

1. Troque o dropdown para **Unified search** (ou **User ID**)
2. Limpe a barra de busca
3. Procure linhas com e-mail **-** e provider **Anonymous**
4. O rodapé **Total: X users** pode ser maior que as linhas visíveis
5. Copie o UID de **Table Editor → users** e busque no Auth

Mais detalhes: [Troubleshooting](https://kasy.dev/docs/referencia/troubleshooting) (seção *Usuário anônimo criado mas não aparece no Supabase Auth*).

### Por que o Firebase Console mostra "Authentication" no meu projeto Supabase?

**Só se existir companion Firebase** (você ligou **push** no Rápido, no Avançado ou com `kasy add notifications`). Sem push, **não** há projeto Firebase companheiro e esta seção não se aplica.

Quando o companion existe: login, sessão e usuários do app ficam **só no Supabase Auth**. O Firebase companheiro **não** é o backend de login.

**O que o Firebase companheiro faz de verdade:**
- **Push (FCM)** e configs nativas (`google-services.json` / `GoogleService-Info.plist`)
- **Remote Config** (quando usado)
- Se Google também estiver ligado **com** push: **automação do OAuth** (mint Client ID/Secret + SHA-1) e registro no Supabase Auth; o Google no Firebase Auth é só temporário e depois é desligado

**Sem push:** Google = OAuth Web no Console + `kasy google` (sem Identity Platform / sem companion).

O app segue o [fluxo oficial do Supabase para Flutter](https://supabase.com/docs/guides/auth/social-login/auth-google?platform=flutter): **web** usa `signInWithOAuth`, **iOS/Android** usam `google_sign_in` + `signInWithIdToken`.

**Isso gera custo extra?** Não. FCM e provedores padrão do Firebase Auth são gratuitos; o companion só existe quando há push.
