Usuários e Autenticação
Cadastro de usuários, login, refresh token e invalidação de sessão.
Usuário (user)
Entidade: UserEntity — estende BaseEntity. Campos: name, email (único), password (hash),
phoneNumber, tokenVersion (contador usado pra invalidar tokens antigos, ver abaixo),
lastPasswordChangeAt, userRoles (papéis atribuídos — ver Permissões).
Endpoints (/gnoqcore/v1/user)
| Método | Rota | Permissão |
|---|---|---|
| POST | / | user:create |
| GET | /{id}, /email/{email}, / (lista) | user:read |
| PUT | /{id} | user:update |
| PATCH | /{id}/password | user:update — reset de senha feito por um admin |
| PATCH | /{id}/restore | user:update |
| DELETE | /{id}/trash, /{id}/force | user:delete |
Autenticação (security/authentication)
Login por email/senha, com access token de vida curta e refresh token rotativo — sessões ficam
registradas no banco (UserSessionEntity), não só no JWT, o que permite revogar remotamente.
Fluxo de login
POST /gnoqcore/v1/auth/logincom email/senha (email normalizado, case-insensitive)- Backend gera dois JWTs:
- Access token — expira em 15 min (configurável), carrega
userId,tokenVersion,roles,permissions - Refresh token — expira em 7 dias (configurável), carrega
userId,tokenVersion,jti(identifica a sessão)
- Access token — expira em 15 min (configurável), carrega
- Uma
UserSessionEntityé criada com ojti,device(user-agent),ipAddresseexpiresAt
Refresh (rotativo)
POST /gnoqcore/v1/auth/refresh recebe o refresh token, valida assinatura + expiração + que a sessão
(jti) ainda existe e não foi revogada, revoga a sessão antiga e emite um par novo (access + refresh).
Isso significa que um refresh token só pode ser usado uma vez — se for reaproveitado após já ter sido
trocado, a sessão associada já estará revogada e a chamada falha.
Logout
DELETE /gnoqcore/v1/auth/logout:
- Sessão única: revoga só o
jtidaquele refresh token — outras sessões/dispositivos continuam válidas. - Todas as sessões (
type=ALL_SESSIONS): revoga todas as sessões do usuário e incrementatokenVersion, o que invalida imediatamente qualquer access token já emitido (mesmo os que ainda não expiraram), porque cada request validatokenVersiondo token contra o valor atual no banco.
Trocar de senha (PATCH /gnoqcore/v1/auth/change-password) também incrementa tokenVersion — força
logout em todos os dispositivos.
Outros endpoints
| Método | Rota | Auth | Descrição |
|---|---|---|---|
| POST | /auth/register | pública | Cria usuário (valida política de senha, email único) |
| POST | /auth/login | pública | Login |
| POST | /auth/refresh | pública (token no body) | Renova o par de tokens |
| DELETE | /auth/logout | autenticado | Logout (sessão única ou todas) |
| GET | /auth/me | autenticado | Dados do usuário logado (a partir das claims do JWT) |
| PATCH | /auth/change-password | autenticado | Troca de senha self-service |
Usuário soft-deletado não consegue logar.