POST /auth/register
Registrar nova conta
/auth/registerAuth: públicoCria uma conta nova com e-mail/senha e retorna um par de tokens já autenticando o usuário (sem precisar de login adicional). Dispara também um e-mail de verificação de endereço.
A conta criada inicia com email_verified = false mas não há restrição de uso enquanto não verificar — o e-mail é informativo apenas hoje. Se quiser bloquear features pra contas não verificadas, fazer no frontend ou criar um middleware específico.
Quando chamar
- No formulário de signup
- Não chamar pra "vincular Google a conta nova" — esse fluxo é via
GET /auth/google(com statemode: 'login')
Request
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
| string (email) | sim | E-mail do usuário (precisa ser único) | |
| password | string | sim | Senha em texto plano. Hash aplicado com bcrypt antes de persistir. |
| displayName | string | sim | Nome público exibido no perfil. |
Validação:
email: formato e-mail válido (Zod.email())password: 8–100 caracteresdisplayName: 2–100 caracteres
Notas:
- O e-mail é validado contra unicidade no DB (constraint UNIQUE em
users.email) - A senha é processada com
bcrypt.hash(password, 12)antes de persistir. Custo 12 → ~250ms de CPU; aceito como deliberadamente lento. displayNameé texto livre, não precisa ser único, não há restrição de caracteres especiais
Response
201
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
| accessToken | string | sim | JWT short-lived (15min). Refresh é via cookie HttpOnly. |
| user | object | sim |
409
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
| error | string | sim | Mensagem ou código tipado do erro. Códigos canônicos: EMAIL_ALREADY_EXISTS, INVALID_CREDENTIALS, INVALID_RESET_TOKEN, PASSWORD_ALREADY_SET, USER_NOT_FOUND. |
A resposta espelha o login: access token + user + cookie de refresh. O usuário já está logado após register.
Erros
| Status | Códigos possíveis (extraídos do schema) |
|---|---|
| 409 | Mensagem ou código tipado do erro |
Como resolver cada caso:
| Código | Causa | Como resolver |
|---|---|---|
EMAIL_ALREADY_EXISTS (mensagem em PT atualmente: "E-mail já cadastrado") | Já existe users.email igual | Direcione o usuário pra /login ou /forgot-password |
Erro de validação Zod (status 400 automático do Fastify) | Body não bate com registerSchema | Mostre os campos com erro retornados em validation/issues |
Exemplos
curl -X POST 'http://localhost:3003/auth/register' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer SEU_ACCESS_TOKEN' \
-d '{}'await fetch('http://localhost:3003/auth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + accessToken,
},
body: JSON.stringify({}),
})Resposta de sucesso (201)
{
"accessToken": "eyJhbGc...",
"user": {
"id": "uuid-novo",
"email": "newuser@example.com",
"displayName": "Novo Usuário"
}
}E no Set-Cookie: igual ao /auth/login.
Side effects
- DB:
INSERT INTO users (...)compassword_hashbcrypt eemail_verified = false - DB:
INSERT INTO refresh_tokens (...)— sessão criada - E-mail: envia e-mail de verificação via
IEmailService.sendEmailVerification(email, verificationUrl). Em dev usa oConsoleEmailAdapter(loga no terminal). Em prod, via SES. - Cookie: refresh token setado
- Sem notificações in-app disparadas (não há "alguém pra notificar")
- Sem eventos de socket
⚠️ Endpoint de verificação ainda não implementado — o link no e-mail aponta pra ${APP_URL}/auth/verify-email?token=... mas hoje não há rota. Pendência: criar POST /auth/verify-email que consome o token e seta email_verified = true. Sem isso, o e-mail é só ornamental.
Relacionados
- Conceito: Autenticação
- Módulo: Auth — fluxo completo
- Endpoint:
POST /auth/login— usuário já tem conta - Endpoint:
GET /auth/google— alternativa social - Tabela:
users— schema completo da conta