Autenticação
Login anônimo, Google, Apple e Facebook. O que a CLI configura e o que você faz manualmente.
Implementação
Google Sign-In
No kasy new, a CLI inclui Google no scaffold (Firebase e Supabase). Com companion Firebase (push no Supabase/API, ou backend Firebase), ela também minta OAuth e registra credenciais. Sem companion, o provedor já fica Enabled no Supabase Auth (como Apple); falta colar Client ID/Secret (kasy google / configure_google_login).
Firebase
O kasy new roda firebase deploy --only auth, que cria o OAuth Web Client e ativa Google (e Anônimo + Email/Senha) no Firebase Auth. O app autentica direto pelo Firebase Auth.
Na web, a CLI também:
- registra no Google Cloud os redirect URIs
firebaseapp.comeweb.app - ajusta
authDomainemfirebase_optionsparaSEU_PROJETO.web.app(same-origin no Hosting padrão; importante no navegador embutido da IDE)
Depois, confira com:
kasy doctorO kasy doctor avisa se o SHA-1 do debug keystore não estiver cadastrado no Android.
Supabase
Login Google é 100% Supabase Auth. O app não usa firebase_auth. Não é necessário companion Firebase só por causa do Google.
No modo Rápido a CLI pergunta se você quer push e se quer Google (terminal interativo). No MCP / kasy new --yes, Google vem ligado por padrão (independente do push; use --no-google / noGoogle só para email-only):
- Push sim + Google sim: companion Firebase (FCM gratuito) + mint OAuth + SHA-1 no app Android do Firebase + provider no Supabase. Você não cria client OAuth Android na mão: Firebase + SHA-1 já amarram o login nativo.
- Push não + Google sim: scaffold inclui Google. Terminal interativo pede o paste do Client ID/Secret e registra credenciais no Supabase Auth. MCP /
--yes: provedor Enabled no create (como Apple) + placeholders;kasy google/configure_google_logindepois para Client ID/Secret.
Sem companion (checklist no Console): projeto GCP separado (cota de org / faturamento obrigatório na org é regra do GCP, não cobra OAuth em Testing) → branding OAuth (Externo, Enter no e-mail de contato) → client Web em Visão geral de OAuth → redirect https://SEU_REF.supabase.co/auth/v1/callback → usuários de teste → copiar Client ID + Secret em texto puro (kasy google ou MCP configure_google_login grava no Supabase automaticamente).
Companion Firebase também entra no Advanced com push ou em kasy add notifications.
| Plataforma | Fluxo |
|---|---|
| Web | signInWithOAuth via Supabase |
| iOS / Android | google_sign_in + signInWithIdToken no Supabase |
Web (produção)
Adicione o domínio de produção em Supabase → Authentication → URL Configuration (Redirect URLs). No dev, o kasy new já libera http://localhost:5555.
Para Firebase, adicione também as origens no OAuth Client (Google Cloud Console → Credenciais → Web client):

Apple Sign-In
Requer conta Apple Developer (paga, USD $99/ano).
Se o seu app oferece login social, o Sign in with Apple deixa de ser opcional. A diretriz 4.8 de revisão da App Store exige que todo app que usa login de terceiro (Google, Facebook, X, LinkedIn) para criar a conta principal ofereça também um serviço de login equivalente que limite a coleta ao nome e e-mail, permita esconder o e-mail e não use as interações para publicidade. O Sign in with Apple atende os três.
Ter e-mail e senha não isenta: a exceção da diretriz vale só para apps que usam exclusivamente o próprio sistema de contas. Como o kit já traz Google, a regra se aplica. Publicar sem o botão da Apple costuma voltar como recusa na revisão.
Não se aplica a apps de educação/empresa com conta corporativa, identidade digital governamental, ou clientes de um serviço específico de terceiro.
1. Ativar capability no Bundle ID
- Abra Identifiers
- Selecione seu Bundle ID
- Ative Sign In with Apple → Enable as a primary App ID → Save
2. Criar chave
- Abra Keys
- Clique em + → dê um nome (ex:
Firebase Sign In with Apple) - Ative Sign In with Apple → Configure → selecione seu Bundle ID → Save
- Registre → baixe o
.p8(só é possível baixar uma vez, guarde em lugar seguro) - Anote o Key ID (ex:
6RR89XG535)
3. Criar ou editar o Services ID (web)
O login Apple na web usa um Services ID (com.empresa.app.signin). Não é o App ID do iOS (com.empresa.app).
- Abra Identifiers ou direto Services IDs
- Filtro: a página abre em App IDs. No dropdown superior direito, mude para Services IDs
- Se não existe: + → Services IDs → Continue
- Description:
Firebase Sign In with Apple· Identifier:SEU_BUNDLE_ID.signin - Registre → abra o Services ID → Sign In with Apple → Configure → Primary App ID: seu Bundle ID
Domains e Return URLs (vírgula na mesma linha):
| Backend | Domains | Return URLs |
|---|---|---|
| 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 |
O portal Apple pede vírgula na mesma linha, não uma URL por linha. Linhas separadas geram One or more domains are invalid e o Next fica cinza.
- Next → Done → Continue → Save

4. Configurar no Firebase
- Abra Firebase Console → Authentication → Apple
- Ative o provedor Apple
- 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
- ID da chave: o Key ID do passo 2
- Chave privada: conteúdo completo do
.p8(incluindo as linhas-----BEGIN PRIVATE KEY-----e-----END PRIVATE KEY-----)
- Services ID: o identifier do passo 3 (ex:
- Salvar
5. Ativar capability no Xcode
- Abra
ios/Runner.xcworkspaceno Xcode - Target Runner → Signing & Capabilities → + Capability → adicione Sign In with Apple
iOS / macOS: o botão Apple aparece automaticamente após os passos acima.
Android: o botão Apple fica escondido por padrão (Apple não oferece login nativo no Android para apps SaaS comuns).
Na web o botão aparece por dispositivo, não por navegador. O kit lê o user agent: iPhone, iPad e Mac mostram o botão da Apple em qualquer navegador (Safari, Chrome, Firefox). Android, Windows e Linux ficam sem ele, de propósito.
O efeito colateral: usuário que troca de aparelho fica trancado. Quem criou a conta com Sign in with Apple no iPhone e depois abre o app (ou o site) no Android não encontra o botão em lugar nenhum, e não existe "esqueci a senha" para conta social.
Se o seu app vai para as duas lojas, decida conscientemente: ou você avisa na tela de login que aquela conta só entra por aparelho Apple, ou oferece um segundo método (e-mail) no cadastro para o usuário ter como voltar.
Web (Firebase): após os passos 1 a 4, rode kasy apple-web, ou, pelo MCP, peça ao assistente "configura o Apple Sign In na web" (ele roda configure_apple_web). Ele grava o Services ID, Team ID, Key ID e .p8 no provedor Apple do Firebase e liga withAppleWebSignin no app. O Services ID precisa dos dois domínios e duas Return URLs (firebaseapp.com e web.app).
Web (Supabase): mesmos passos 1 a 3 na Apple Developer, mas o Return URL do Services ID é https://SEU_PROJETO.supabase.co/auth/v1/callback (domain SEU_PROJETO.supabase.co, não Firebase Hosting). Depois rode kasy apple-web para assinar o secret e gravar no Supabase (expira ~6 meses).
Facebook Sign-In
Requer conta no Meta for Developers.
Atalho: após criar e configurar o app na Meta (passos 1 a 5), rode kasy facebook, ou, pelo MCP, peça "configura o Facebook Login" (tool configure_facebook_login). Ele grava as credenciais no Info.plist, strings.xml e no Firebase/Supabase automaticamente. Veja MCP do Kasy.
1. Criar app no Meta
- Abra Meta for Developers → My Apps
- Clique em Create App → selecione Consumer → Next
- Preencha o nome do app → Create App
- No painel do app, anote o App ID e o Client Token (Settings → Advanced → Client Token)
2. Ativar Facebook Login
- No painel do app Meta → Add Product → Facebook Login → Set Up → iOS e/ou Android
- iOS: informe o Bundle ID do seu app
3. iOS: atualizar Info.plist
Edite ios/Runner/Info.plist e substitua os placeholders:
<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):
<string>fbSEU_APP_ID</string>4. Android: atualizar strings.xml
Edite android/app/src/main/res/values/strings.xml e substitua os placeholders:
<string name="facebook_app_id">SEU_APP_ID</string>
<string name="facebook_client_token">SEU_CLIENT_TOKEN</string>5. Web: adicionar domínio no Meta
- No painel do app Meta → Facebook Login → Settings
- Em Valid OAuth Redirect URIs, adicione:
- Backend Firebase (as duas):
https://SEU_PROJETO.firebaseapp.com/__/auth/handlerhttps://SEU_PROJETO.web.app/__/auth/handler
- Backend Supabase:
https://SEU_PROJETO.supabase.co/auth/v1/callback
- Backend Firebase (as duas):
- Em Allowed Domains for the JavaScript SDK, adicione os domínios do app (
firebaseapp.comeweb.appno Firebase; seu host web no Supabase)
Depois rode kasy facebook para aplicar automaticamente ou rode kasy doctor para verificar.
Informações
Como o login funciona no app
Mobile (padrão): conta anônima
Ao abrir o app no nativo, uma conta anônima é criada automaticamente. O usuário entra direto na Home. Depois pode vincular um e-mail ou conta social em Configurações, sem perder dados.
App abre → conta anônima → onboarding → Home
Usuário quer conta real → /signin → vincula à anônima existenteFirebase: exige provider Anônimo ativo no Firebase Auth e kasy deploy antes do primeiro boot.
Supabase: o kasy new ativa anônimo automaticamente no config.toml (enable_anonymous_sign_ins = true). Nada para fazer no dashboard.
Supabase (painel): em Authentication → Users, o dropdown da busca pode estar em Email address. Anônimos não têm e-mail e somem da lista. Use Unified search ou busque pelo User ID copiado de public.users. Ver Troubleshooting.
API REST: não suporta anônimo nativamente. Mude authenticationMode para authRequired em lib/environments.dart (recomendado) ou implemente POST /auth/guest no seu servidor.
Web
Sem login anônimo. O fluxo vai direto para /signin:
App abre → /signin → login ou cadastro → HomeTrocar o modo
Em lib/environments.dart:
authenticationMode: AuthenticationMode.anonymous, // padrão
// ou
authenticationMode: AuthenticationMode.authRequired,| Modo | Comportamento |
|---|---|
anonymous | Conta criada ao abrir. Dados preservados ao vincular |
authRequired | Sem conta até o usuário fazer login |
O que o usuário sem conta consegue fazer
Vale tanto para o anônimo (anonymous) quanto para o hóspede (authRequired): a tela nunca fecha na cara dele, e o que depende de conta é ignorado em silêncio, sem crash.
| Área | Usuário sem conta |
|---|---|
| Onboarding | Completo, igual a quem tem conta |
| Home | Acessível |
| Notificações | Tela abre, lista vazia |
| Feedback e votos | Vê a lista; o voto é ignorado |
| Assinatura | O paywall abre; a compra pede login no passo seguinte |
| Avatar e upload | A tela abre; o upload é ignorado |
| Permissão ATT (iOS) | Abre e avança; RevenueCat e Facebook não inicializam |
| Qualquer gravação no banco | Ignorada em silêncio |
O botão "Continuar sem conta" na tela de login volta para a Home no nativo; na web ele marca localmente que a etapa de auth foi cumprida e entra na Home.
Proteger uma tela
final user = ref.watch(userStateNotifierProvider).user;
if (user.idOrNull == null) {
context.push('/signin');
return;
}Supabase: onde cadastrar as credenciais
Para projetos com backend Supabase, os passos na Apple e no Meta são idênticos. O que muda é onde cadastrar as credenciais:
| Provedor | Onde configurar |
|---|---|
| Supabase Dashboard → Auth → Providers → Google | |
| Apple | Supabase Dashboard → Auth → Providers → Apple (Services ID obrigatório) |
| Supabase Dashboard → Auth → Providers → Facebook |
No Apple com Supabase, o Return URL do Services ID deve ser:
https://SEU_PROJETO.supabase.co/auth/v1/callbackLogin social: vincula à conta anônima
No mobile, o login social vincula à conta anônima existente: o UID e todos os dados do usuário são preservados. Mesma interface nos três backends.
Cadastro com e-mail/senha: também vincula
Não é só o login social. Cadastrar com e-mail e senha a partir do estado anônimo também vincula à conta existente (não cria uma conta separada), mesmo UID, mesmos dados preservados. Firebase e Supabase já fazem isso automaticamente.
API REST: o vínculo depende de como você implementar POST /auth/signup no seu servidor, esse backend não tem noção nativa de conta anônima, então "vincular" é responsabilidade da sua própria API.
Atualizado em 03/11/2026

