API ReferenceAuth
PUT /auth/change-password
Trocar senha (autenticado)
PUT
/auth/change-passwordAuth: accessTokenTroca a senha de um usuário autenticado. Requer apresentar a senha atual (proteção contra session hijacking — atacante com access token roubado precisa também da senha pra trocar).
Não revoga sessões existentes — diferente de reset-password. Se quiser invalidar todas as sessões após mudança, use reset-password em vez disso.
Quando chamar
- Tela de configurações → "Mudar senha", após user preencher senha atual + nova
- Não é o caminho pra "definir senha inicial em conta criada por OAuth" — pra isso use
POST /auth/set-password
Request
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
| currentPassword | string | sim | |
| newPassword | string | sim |
Validação:
currentPassword: string não-vazia (semminno schema, mas vazia falha por bcrypt.compare)newPassword: 8–100 caracteres
Header obrigatório: Authorization: Bearer <accessToken>. Sem ele, middleware authenticate retorna 401 antes do controller.
Response
204
object400
| 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. |
204 No Content. Frontend deve mostrar confirmação visual ("Senha alterada com sucesso") sem redirecionar.
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) | Causa | Como resolver |
|---|---|---|---|
| 401 | (sem corpo) | JWT ausente, expirado, ou inválido | Refresh ou re-login |
| 400 | "Senha atual incorreta" (INVALID_CREDENTIALS) | bcrypt.compare falhou | Mostre erro no campo "senha atual"; permita retry |
| 400 | Validação Zod | newPassword < 8 ou > 100 | Mostre validação no campo |
Exemplos
curl -X PUT 'http://localhost:3003/auth/change-password' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer SEU_ACCESS_TOKEN' \
-d '{}'await fetch('http://localhost:3003/auth/change-password', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + accessToken,
},
body: JSON.stringify({}),
})Resposta de sucesso
HTTP/1.1 204 No Content(corpo vazio)
Side effects
- DB:
UPDATE users SET password_hash = bcrypt(newPassword) WHERE id = userId— apenas o hash é atualizado - NÃO mexe em
refresh_tokens— sessões em outros dispositivos continuam ativas - Sem e-mail de aviso — pendência: mandar "sua senha foi alterada" pro user (auditoria de segurança). Hoje não implementado.
- Sem notificação ou socket
Relacionados
- Endpoint:
POST /auth/reset-password— fluxo "esqueci minha senha" (revoga sessões) - Endpoint:
POST /auth/set-password— primeira senha em conta OAuth - Conceito: Autenticação
- Tabela:
users— campopassword_hash