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

137 lines
3.4 KiB
Markdown

# 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:
> ```powershell
> python -c "import secrets; print(secrets.token_hex(32))"
> ```
---
## 2. Instalar Novas Dependências (backend)
```powershell
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
```powershell
# 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:
```powershell
uv run flask db downgrade
uv run flask db upgrade
```
---
## 4. Testar os Endpoints Manualmente
### Cadastro
```powershell
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
```powershell
Invoke-WebRequest -Uri "http://localhost:5000/api/v1/auth/login" `
-Method POST `
-ContentType "application/json" `
-Body '{"email":"teste@exemplo.com","password":"senha1234"}'
```
### Perfil autenticado
```powershell
$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)
```powershell
Invoke-WebRequest -Uri "http://localhost:5000/api/v1/auth/me"
# Espera: StatusCode 401
```
---
## 5. Rodar os Testes (backend)
```powershell
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):
```javascript
localStorage.getItem('imob_token') // deve retornar o JWT string
```
Após logout:
```javascript
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