Módulos
Auth
Registro, login, OAuth com Google, refresh, recuperação e troca de senha.
Visão geral
O módulo Auth é responsável por toda a autenticação do Geek Social. Ele cobre:
- Registro de conta com e-mail/senha
- Login com e-mail/senha
- Login social com Google (OpenID Connect)
- Vínculo/desvínculo da conta Google em conta já existente
- Rotação de tokens (access JWT curto + refresh longo via cookie HttpOnly)
- Recuperação de senha por e-mail (forgot/reset)
- Troca de senha autenticada e definição inicial de senha (para contas criadas via OAuth)
Entidades principais
| Tabela | O que guarda |
|---|---|
users | Conta do usuário, senha hash, vínculo Google, flags (email_verified, privacy, etc.) |
refresh_tokens | Tokens de refresh ativos (1 por sessão); rotacionados a cada /auth/refresh |
password_reset_tokens | Tokens single-use de reset, TTL 1h |
Endpoints
Ver API Reference — Auth. 12 endpoints no total:
| Endpoint | Auth | Resumo |
|---|---|---|
POST /auth/register | público | Cria conta + emite tokens |
POST /auth/login | público | Email/senha → tokens |
POST /auth/refresh | cookie | Rotaciona o par de tokens |
POST /auth/logout | cookie | Revoga refresh e limpa cookie |
POST /auth/forgot-password | público | Dispara e-mail com token de reset |
POST /auth/reset-password | público | Consome token + nova senha |
PUT /auth/change-password | JWT | Senha atual + nova |
POST /auth/set-password | JWT | Define senha inicial (após OAuth) |
GET /auth/google | público | Inicia OAuth (redirect) |
GET /auth/google/link | JWT | Inicia vínculo (retorna URL) |
GET /auth/google/callback | — | Callback do Google (sempre redireciona) |
DELETE /auth/google/link | JWT | Desvincula Google |
Fluxos
1. Registro com e-mail/senha
2. Login com e-mail/senha
3. Login com Google OAuth
4. Refresh token rotation
5. Recuperação de senha (forgot + reset)
Eventos de socket
O módulo Auth não emite nem consome eventos de socket diretamente — autenticação é HTTP. O socket separado (Socket.IO) recebe o JWT no handshake; ver Realtime (em breve).
Edge cases e regras especiais
- Refresh rotation cega — todo
/auth/refreshrotaciona o cookie. Replay de token antigo retorna 401. Se duas tabs disputarem refresh ao mesmo tempo, uma vai falhar com 401 e cair pro login — comportamento aceito como trade-off de segurança. - Reset revoga tudo —
/auth/reset-passwordapaga TODOS os refresh tokens do usuário. Sessões em outros dispositivos caem pro login no próximo refresh. Isso é intencional pra cobrir caso de conta comprometida. change-passwordNÃO revoga sessões — diferente do reset. Quem trocar senha continua logado em outros dispositivos. Use reset se quiser invalidar tudo.forgot-passwordé idempotente e silenciosa — sempre retorna 200, mesmo com e-mail inexistente, pra não vazar quais contas existem (enumeration attack).- OAuth state token JWT (5min) —
/auth/googleassina um JWT curto commodee (selink)userId. Callback verifica antes de aceitar. Inválido →INVALID_STATE. - Vínculo automático por e-mail — se o usuário já tem conta com aquele e-mail e usa Google pela primeira vez, a conta é vinculada automaticamente (modo
linked-loginna resposta). - Avatar do Google — copiado pra
users.avatar_urlno primeiro vínculo apenas se o usuário ainda não tem avatar próprio. - Unlink Google sem senha bloqueia —
DELETE /auth/google/linkfalha comPASSWORD_REQUIRED_BEFORE_UNLINK(409) se o user não tiverpassword_hash. UsePOST /auth/set-passwordantes. set-passwordúnica vez — só permite se a conta ainda não tem senha (criada via OAuth). Falha comPASSWORD_ALREADY_SET(409) se já houver.- Bcrypt cost 12 — fixo. Hash leva ~250ms; não trocar sem cuidado de migração.
- Refresh token armazenado como sha256 — DB nunca tem o token raw. Comparação faz sha256 do cookie e compara. Mesmo um dump de DB não revela tokens válidos.
Dependências entre módulos
- Middleware
authenticate(emshared/middleware/) é consumido por TODOS os outros módulos. LêAuthorization: Bearer <jwt>, verifica viaapp.jwt.verify, popularequest.user = { userId, email }. UserRepository—auth.repository.tsé o dono das tabelasusers,refresh_tokens,password_reset_tokens. Outros módulos NÃO devem inserir/atualizar essas tabelas; usamusersRepository(read-only views) ou contracts.emailService—auth.service.tsinjeta umIEmailService(em dev, console adapter; em prod, SES). Mesmo padrão usado por outros módulos que mandam e-mail.- Google OAuth opcional — só registra rotas se
GOOGLE_OAUTH_ENABLED=truee credenciais estão setadas. App funciona sem isso.