Skip to main content

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_token temporário trocável via POST /auth/verify
  • Recebe webhooks do app-front quando um pagamento é confirmado

Fluxo resumido

[Usuário acessa app]

App detecta sem sessão → redireciona para SSO /auth/login?redirect_to=<callback>

SSO autentica via Supabase (PKCE)

/auth/callback: cria/valida perfil, assina eg_session, seta cookie httpOnly

/auth/welcome: tela de splash (4s)

Redirect para redirect_to com ?eg_session=<token> (se cross-domain autorizado)

App /auth/callback: salva eg_session no cookie local → redireciona para destino final
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.
O eg_session é um JWT assinado com SSO_JWT_SECRET e setado em:
  • httpOnly: true — não acessível por JavaScript
  • domain: .easygoal.com.br em produção — compartilhado entre todos os subdomínios
Claims do eg_session:
CampoTipoDescrição
substringID do usuário (= auth.uid() no Supabase)
emailstringE-mail do usuário
namestringNome completo
avatar_urlstringURL do avatar
is_producerbooleantrue se o produtor tem status verified
is_betabooleantrue se aceitou o NDA do programa beta
company_namestringNome da empresa vinculada
rank_namestringRank atual do usuário
plan_slugstringPlano ativo (easy-standard, easy-pro, easy-enterprise)
providerstringProvider 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

# Supabase (mesma instância compartilhada com o app-front)
NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key

# URL pública do SSO
NEXT_PUBLIC_APP_URL=https://sso.easygoal.com.br

# Segredo para assinar eg_session JWT
SSO_JWT_SECRET=your-jwt-secret

# Webhook — DEVE ser idêntico ao SSO_WEBHOOK_SECRET do app-front
WEBHOOK_SECRET=your-webhook-secret-key

# Domínio do cookie (produção)
COOKIE_DOMAIN=.easygoal.com.br

# Email
RESEND_API_KEY=your-resend-api-key
WEBHOOK_SECRET (SSO) e SSO_WEBHOOK_SECRET (app-front) devem ser idênticos. Qualquer divergência fará com que todos os webhooks sejam rejeitados com status 401.

Endpoints do SSO

MétodoEndpointDescrição
GET/auth/loginFormulário de login — aceita ?redirect_to=<url>
GET/auth/signupCriar conta
GET/auth/forgot-passwordSolicitar reset de senha
GET/auth/reset-passwordRedefinir senha (via link de email)
GET/auth/callbackCallback OAuth do Supabase — cria perfil + emite eg_session
GET/auth/welcomeTela de splash (4s) exibida após login — redireciona para destino
GET/auth/checkVerifica se o eg_session cookie é válido — retorna JSON
POST/auth/verifyValida eg_token temporário de app externo — retorna eg_session
POST/auth/signoutLogout — invalida cookie eg_session
GET/auth/errorPágina de erro de autenticação
GET/complete-profileCompletar perfil após OAuth
GET/api/meRetorna perfil do usuário via Bearer <supabase_token>
POST/api/webhook/paymentRecebe notificação de compra (HMAC SHA256)
GET/api/webhook/paymentHealth check do endpoint
GET/api/plans/publicPlanos disponíveis (público)

Checklist do SSO

Configurar SSO_JWT_SECRET para assinar o eg_session
Configurar WEBHOOK_SECRET (= SSO_WEBHOOK_SECRET do app-front)
Configurar NEXT_PUBLIC_SUPABASE_URL e NEXT_PUBLIC_SUPABASE_ANON_KEY
Adicionar 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 SHA256
Testar webhook com o botão “Testar Webhook” no admin do app-front