Cookest
API Backend

Autenticação

Fluxo de autenticação JWT — início de sessão, atualização e endpoints protegidos

Autenticação

O Cookest utiliza um par de tokens JWT de acesso + atualização. Os tokens de acesso têm curta duração (15 min); os tokens de atualização têm longa duração (30 dias) e são armazenados no servidor como sha256(token).

Fluxo

Token Bearer

Todos os endpoints protegidos requerem:

Authorization: Bearer <access_token>

Claims do token

{
  "sub": "uuid-of-user",
  "email": "user@example.com",
  "exp": 1234567890,
  "iat": 1234567800,
  "jti": "unique-token-id",
  "tier": "pro",
  "is_admin": false,
  "token_type": "access"
}

A claim tier permite restringir funcionalidades no lado do cliente sem uma chamada à API extra:

final payload = JwtDecoder.decode(accessToken);
final tier = payload['tier'] as String; // "free" | "pro" | "family"
if (tier == 'free') showUpgradePrompt();

Registo

POST /api/auth/register
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "securepassword",
  "name": "Alice"
}

Resposta: 201 Created — utilizador criado mas ainda não configurado.

Início de sessão

POST /api/auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "securepassword"
}

Resposta:

{
  "access_token": "eyJ...",
  "token_type": "Bearer",
  "expires_in": 900
}

O refresh_token é definido automaticamente como cookie httpOnly.

Atualização

POST /api/auth/refresh
# Cookie: refresh_token=<token>  (enviado automaticamente pelo browser/Dio)

Devolve um novo access_token. O cookie de atualização também é renovado.

Terminar sessão

POST /api/auth/logout
Authorization: Bearer <access_token>

Invalida o token de atualização na base de dados.

Configuração inicial

Após o registo, complete o perfil do utilizador:

POST /api/auth/onboarding
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "household_size": 2,
  "dietary_restrictions": ["vegetarian"],
  "allergies": ["nuts"],
  "health_goals": ["weight_loss"],
  "cooking_skill": "intermediate"
}

Modelo de segurança

PreocupaçãoSolução
Armazenamento de palavra-passeArgon2id (com uso intensivo de memória)
Armazenamento do token de atualizaçãoApenas hash SHA-256 — token em bruto nunca persistido
Armazenamento do token de acessoApenas memória do cliente — nunca localStorage
Transporte do token de atualizaçãoCookie httpOnly — inacessível ao JS
Verificação de administradorSempre reverificada na BD — claim JWT não é confiada isoladamente
Limitação de taxaMiddleware governor em todos os endpoints

On this page