O que é o SSO EasyGoal?
O SSO (Single Sign-On) é o serviço de autenticação centralizado do ecossistema Easy Goal. Ele:- Autentica usuários usando Supabase Auth (email/senha + OAuth Google, GitHub, Azure/Microsoft)
- Emite um cookie
eg_session(JWT assinado) compartilhável em subdomínios.easygoal.com.br - Injeta
?eg_session=<token>nos redirects cross-domain para apps internos autorizados - Para apps externos: emite um
eg_tokentemporário trocável viaPOST /auth/verify - Recebe webhooks do app-front quando um pagamento é confirmado
Fluxo resumido
O parâmetro de redirect é
redirect_to (não redirect_uri). Use sempre redirect_to ao construir URLs de redirecionamento para o SSO. A URL deve estar cadastrada em Supabase → Auth → URL Configuration.Cookie eg_session
O eg_session é um JWT assinado com SSO_JWT_SECRET e setado em:
httpOnly: true— não acessível por JavaScriptdomain: .easygoal.com.brem produção — compartilhado entre todos os subdomínios
eg_session:
| Campo | Tipo | Descrição |
|---|---|---|
sub | string | ID do usuário (= auth.uid() no Supabase) |
email | string | E-mail do usuário |
name | string | Nome completo |
avatar_url | string | URL do avatar |
is_producer | boolean | true se o produtor tem status verified |
is_beta | boolean | true se aceitou o NDA do programa beta |
company_name | string | Nome da empresa vinculada |
rank_name | string | Rank atual do usuário |
plan_slug | string | Plano ativo (easy-standard, easy-pro, easy-enterprise) |
provider | string | Provider OAuth usado (google, github, azure, email) |
Não há claim
role ou discord_id no eg_session. A autorização de administrador é verificada no app-front via requireAdmin() que consulta o banco diretamente.Integração via @easygoal/packages/auth (recomendado)
Para conectar um app ao SSO, use o package do monorepo. Ele encapsula o handleAuthCallback, EgSessionProvider e hook useEgSession.
Veja o fluxo completo em Autenticação Cross-Domain.
Variáveis de Ambiente do SSO
Endpoints do SSO
| Método | Endpoint | Descrição |
|---|---|---|
GET | /auth/login | Formulário de login — aceita ?redirect_to=<url> |
GET | /auth/signup | Criar conta |
GET | /auth/forgot-password | Solicitar reset de senha |
GET | /auth/reset-password | Redefinir senha (via link de email) |
GET | /auth/callback | Callback OAuth do Supabase — cria perfil + emite eg_session |
GET | /auth/welcome | Tela de splash (4s) exibida após login — redireciona para destino |
GET | /auth/check | Verifica se o eg_session cookie é válido — retorna JSON |
POST | /auth/verify | Valida eg_token temporário de app externo — retorna eg_session |
POST | /auth/signout | Logout — invalida cookie eg_session |
GET | /auth/error | Página de erro de autenticação |
GET | /complete-profile | Completar perfil após OAuth |
GET | /api/me | Retorna perfil do usuário via Bearer <supabase_token> |
POST | /api/webhook/payment | Recebe notificação de compra (HMAC SHA256) |
GET | /api/webhook/payment | Health check do endpoint |
GET | /api/plans/public | Planos disponíveis (público) |
Checklist do SSO
Configurar
SSO_JWT_SECRET para assinar o eg_sessionConfigurar
WEBHOOK_SECRET (= SSO_WEBHOOK_SECRET do app-front)Configurar
NEXT_PUBLIC_SUPABASE_URL e NEXT_PUBLIC_SUPABASE_ANON_KEYAdicionar URLs de redirect em Supabase → Auth → URL Configuration
Registrar URLs de callback em Supabase → Auth → Redirect URLs
Implementar
POST /api/webhook/payment com verificação HMAC SHA256Testar webhook com o botão “Testar Webhook” no admin do app-front