API ReferenceAuth
POST /auth/reset-password
Redefinir senha via token
POST
/auth/reset-passwordAuth: públicoConsome o token recebido por e-mail (gerado por /auth/forgot-password), valida que ainda é válido, e atualiza a senha do usuário. Como medida de segurança, revoga TODOS os refresh tokens do usuário após troca — isso desloga sessões em outros dispositivos, no caso de o reset estar acontecendo por suspeita de comprometimento.
Tokens são single-use: após reset bem-sucedido, o token é marcado como used_at = now() e não pode ser reutilizado.
Quando chamar
- Tela "Redefinir senha", quando o usuário clica no link do e-mail e submete a nova senha
- O token é extraído da query string da URL (
?token=...) e enviado no body junto comnewPassword
Request
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
| token | string | sim | Token recebido por e-mail (válido por 1 hora, single-use). |
| newPassword | string | sim |
Validação:
token: string não-vazia (32 bytes hex = 64 caracteres tipicamente, mas o backend não enforced o tamanho)newPassword: 8–100 caracteres
Response
200
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
| message | string | sim |
400
| 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. |
{ "message": "Senha redefinida com sucesso." }Frontend deve redirecionar pra login após receber 200 — o usuário precisa logar com a nova senha (a sessão antiga foi revogada).
Erros
| Status | Códigos possíveis (extraídos do schema) |
|---|---|
| 400 | Mensagem ou código tipado do erro |
Como resolver cada caso:
| Status | Mensagem (legacy PT) ou código | Causa | Como resolver |
|---|---|---|---|
| 400 | "Token inválido ou expirado" ou INVALID_RESET_TOKEN | Token não existe / já foi usado / passou de 1h | Solicitar novo via /auth/forgot-password |
| 400 | Erro de validação Zod | newPassword < 8 chars ou > 100 | Mostrar campos com erro |
Exemplos
curl -X POST 'http://localhost:3003/auth/reset-password' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer SEU_ACCESS_TOKEN' \
-d '{}'await fetch('http://localhost:3003/auth/reset-password', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + accessToken,
},
body: JSON.stringify({}),
})Resposta de sucesso
{ "message": "Senha redefinida com sucesso." }Side effects
- DB:
UPDATE users SET password_hash = bcrypt(newPassword) WHERE id = ? - DB:
UPDATE password_reset_tokens SET used_at = now() WHERE id = ?— token marcado como consumido (não deletado, pra auditoria) - DB:
DELETE FROM refresh_tokens WHERE user_id = ?— TODAS as sessões do usuário são revogadas, em todos os dispositivos - Sem e-mail de confirmação enviado — pendência: mandar "Sua senha foi redefinida em X" pro user saber, em caso de reset não-autorizado. Hoje não implementado.
- Sem notificação in-app ou socket
Relacionados
- Endpoint:
POST /auth/forgot-password— passo anterior - Endpoint:
PUT /auth/change-password— alternativa autenticada (não revoga sessões) - Tabela:
password_reset_tokens— onde o token vive - Tabela:
refresh_tokens— todas as linhas do user são deletadas - Conceito: Autenticação