sass-imobiliaria/.specify/features/005-authentication/quickstart.md

3.4 KiB

Quickstart: 005-authentication

Como configurar, migrar e testar o sistema de autenticação localmente.


Pré-requisitos

  • Docker + Docker Compose rodando (.\start.ps1 ou docker-compose up)
  • Backend acessível em http://localhost:5000
  • Frontend acessível em http://localhost:5173

1. Variáveis de Ambiente

Adicione ao backend/.env (e ao docker-compose.yml se o container não herdar o .env):

JWT_SECRET_KEY=sua-chave-secreta-longa-e-aleatoria-aqui

Gere uma chave segura no terminal:

python -c "import secrets; print(secrets.token_hex(32))"

2. Instalar Novas Dependências (backend)

cd backend
uv add "PyJWT>=2.9" "bcrypt>=4.2" "pydantic[email]"

Verifique que uv.lock foi atualizado e commit junto com o pyproject.toml atualizado.


3. Gerar e Aplicar a Migration

# Com DATABASE_URL definida ou container rodando:
uv run flask db migrate -m "add client_users"
uv run flask db upgrade

Teste o ciclo completo antes de commitar:

uv run flask db downgrade
uv run flask db upgrade

4. Testar os Endpoints Manualmente

Cadastro

Invoke-WebRequest -Uri "http://localhost:5000/api/v1/auth/register" `
  -Method POST `
  -ContentType "application/json" `
  -Body '{"name":"Teste","email":"teste@exemplo.com","password":"senha1234"}'

Login

Invoke-WebRequest -Uri "http://localhost:5000/api/v1/auth/login" `
  -Method POST `
  -ContentType "application/json" `
  -Body '{"email":"teste@exemplo.com","password":"senha1234"}'

Perfil autenticado

$TOKEN = "<access_token da resposta acima>"
Invoke-WebRequest -Uri "http://localhost:5000/api/v1/auth/me" `
  -Headers @{ Authorization = "Bearer $TOKEN" }

Rota protegida sem token (deve retornar 401)

Invoke-WebRequest -Uri "http://localhost:5000/api/v1/auth/me"
# Espera: StatusCode 401

5. Rodar os Testes (backend)

cd backend
uv run pytest tests/ -v

6. Frontend — Verificar os Fluxos

Com backend + frontend rodando:

URL Comportamento esperado
http://localhost:5173/login Exibe formulário de login com estilo Linear dark
http://localhost:5173/cadastro Exibe formulário de cadastro
http://localhost:5173/area-do-cliente Redireciona para /login se não autenticado
Após login bem-sucedido Redireciona para /area-do-cliente
Navbar sem autenticação Botão "Entrar" visível
Navbar autenticado Inicial do usuário + botão "Sair" visível

7. Verificar Token no localStorage

No console do navegador (após login):

localStorage.getItem('imob_token')  // deve retornar o JWT string

Após logout:

localStorage.getItem('imob_token')  // deve retornar null

8. Checklist de Segurança Pós-implementação

  • JWT_SECRET_KEY não aparece em nenhum arquivo versionado (.env.example pode ter placeholder)
  • grep -r "JWT_SECRET" backend/app/ retorna apenas referências a os.environ ou app.config
  • Login com senha errada retorna 401 com mensagem genérica (não indica se e-mail ou senha está incorreto)
  • Cadastro com e-mail duplicado retorna 409 (não 500)
  • Acesso a /api/v1/auth/me sem token retorna 401 (não 500)
  • password_hash nunca aparece em nenhuma resposta JSON da API