> ## Documentation Index
> Fetch the complete documentation index at: https://docs.domsoftware.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Autenticação

> Login, registro, sessões JWT e recuperação de senha no OmniDom.

## Visão geral

O OmniDom usa **JWT via cookies HttpOnly** para autenticação. O fluxo é:

1. `POST /auth/login` → recebe `accessToken` e `refreshToken` em cookies.
2. Todas as requisições protegidas enviam os cookies automaticamente.
3. Quando o `accessToken` expira, use `POST /auth/refresh` para renová-lo.
4. `POST /auth/logout` invalida a sessão no servidor e limpa os cookies.

<Note>
  Os cookies são `HttpOnly` e `Secure`. Você não precisa (e não consegue) lê-los via JavaScript no frontend — o navegador os envia automaticamente.
</Note>

***

## Endpoints

### Registrar usuário

```http theme={null}
POST /auth/register
Content-Type: application/json
```

**Body:**

```json theme={null}
{
  "name": "João Silva",
  "email": "joao@empresa.com",
  "password": "MinhaS3nha!",
  "tenantId": "uuid-do-tenant"
}
```

**Resposta `200`:** Usuário criado. Os cookies `accessToken` e `refreshToken` são definidos.

***

### Login

```http theme={null}
POST /auth/login
Content-Type: application/json
```

**Body:**

```json theme={null}
{
  "email": "joao@empresa.com",
  "password": "MinhaS3nha!",
  "rememberMe": false
}
```

| Campo        | Tipo    | Descrição                                         |
| ------------ | ------- | ------------------------------------------------- |
| `email`      | string  | E-mail cadastrado                                 |
| `password`   | string  | Senha do usuário                                  |
| `rememberMe` | boolean | Se `true`, o refresh token tem validade estendida |

**Resposta `200`:**

```json theme={null}
{
  "user": {
    "id": "uuid",
    "name": "João Silva",
    "email": "joao@empresa.com",
    "tenantId": "uuid-do-tenant"
  }
}
```

Os cookies `accessToken` e `refreshToken` são definidos na resposta.

***

### Dados do usuário autenticado

```http theme={null}
GET /auth/me
```

Requer cookie `accessToken` válido.

**Resposta `200`:**

```json theme={null}
{
  "id": "uuid",
  "name": "João Silva",
  "email": "joao@empresa.com",
  "tenantId": "uuid-do-tenant"
}
```

***

### Renovar token de acesso

```http theme={null}
POST /auth/refresh
```

Usa o cookie `refreshToken` para emitir um novo `accessToken`.

**Resposta `200`:** Novo cookie `accessToken` definido.

**Erro `401`:** Refresh token ausente ou inválido.

***

### Logout

```http theme={null}
POST /auth/logout
```

Requer cookie `accessToken` válido. Invalida a sessão no servidor e limpa ambos os cookies.

**Resposta `200`:**

```json theme={null}
{ "message": "Logout realizado com sucesso" }
```

***

## Gestão de sessões

### Listar sessões ativas

```http theme={null}
GET /auth/sessions
```

**Rate limit:** 10 requisições por minuto.

Retorna todas as sessões ativas do usuário no tenant atual.

***

### Revogar uma sessão

```http theme={null}
POST /auth/sessions/:id/revoke
```

| Parâmetro | Tipo | Descrição              |
| --------- | ---- | ---------------------- |
| `id`      | UUID | ID da sessão a revogar |

**Rate limit:** 10 requisições por minuto.

***

## Recuperação de senha

### Solicitar redefinição

```http theme={null}
POST /auth/forgot-password
Content-Type: application/json
```

**Rate limit:** 3 requisições por hora por IP.

**Body:**

```json theme={null}
{ "email": "joao@empresa.com" }
```

Um e-mail com link de redefinição é enviado se o endereço existir no sistema.

***

### Redefinir senha

```http theme={null}
POST /auth/reset-password
Content-Type: application/json
```

**Body:**

```json theme={null}
{
  "token": "token-recebido-por-email",
  "newPassword": "NovaSenha@123"
}
```

***

## Estrutura do JWT

O `accessToken` contém os seguintes campos no payload:

| Campo       | Descrição                         |
| ----------- | --------------------------------- |
| `sub`       | ID do usuário                     |
| `tenantId`  | ID do tenant                      |
| `sessionId` | ID da sessão (para revogação)     |
| `jti`       | JWT ID (para blacklist/revogação) |

<Warning>
  Não use o campo `tenantId` do lado do cliente para lógica de autorização. O backend valida o tenant em cada requisição via `TenantGuard`.
</Warning>
