Boilerplate de API REST em produção com TypeScript ā autenticação JWT (access + refresh), RBAC, validação, Swagger, testes e Docker.
Um ponto de partida pronto para produção para APIs Node.js ā resolvendo as partes que toda empresa precisa e ninguĆ©m quer reescrever: autenticação, autorização por papĆ©is, validação de entrada, documentação e testes. Arquitetura em camadas e repositório plugĆ”vel (troque memória ā PostgreSQL sem mexer nos serviƧos).
- š Autenticação JWT com access + refresh token e rotação + revogação (logout)
- š”ļø RBAC ā autorização por papĆ©is (
ADMIN,USER) - š Senhas com bcrypt
- šŖ Helmet (headers de seguranƧa) + CORS por origem configurĆ”vel
- š¦ Rate limiting nas rotas de autenticação (
express-rate-limit) - ā Validação de entrada com Zod (erros 400 estruturados)
- š Swagger UI em
/docs(OpenAPI 3) - 𧪠20 testes de integração (Vitest + Supertest)
- š³ Docker + docker-compose (com PostgreSQL)
- āļø CI no GitHub Actions (typecheck + testes + build)
- š§± Arquitetura modular (config, lib, middleware, modules)
| Método | Rota | Auth | Descrição |
|---|---|---|---|
POST |
/api/auth/register |
ā | Cria conta (retorna tokens) |
POST |
/api/auth/login |
ā | Login (retorna tokens) |
POST |
/api/auth/refresh |
ā | Renova e rotaciona os tokens |
POST |
/api/auth/logout |
ā | Revoga o refresh token informado |
GET |
/api/auth/me |
Bearer | Dados do usuƔrio logado |
GET |
/api/users |
ADMIN | Lista usuƔrios |
GET |
/api/users/:id |
ADMIN | Detalhe |
PATCH |
/api/users/:id |
ADMIN | Atualiza |
DELETE |
/api/users/:id |
ADMIN | Remove |
GET |
/health Ā· /docs |
ā | Status Ā· Documentação |
npm install
cp .env.example .env # gere segredos JWT fortes: openssl rand -hex 32
npm run dev # http://localhost:3000 (docs em /docs)
npm test # 20 testes de integração
npm run build # bundle de produção (tsup)
ā ļø Segredos JWT sĆ£o obrigatórios. Emproductiona aplicação falha ao iniciar seJWT_ACCESS_SECRET/JWT_REFRESH_SECRETestiverem ausentes, com menos de 32 caracteres ou usando placeholders conhecidos. Em dev/test, um segredo efĆŖmero Ć© gerado automaticamente (com aviso) e os tokens sĆ£o invalidados a cada reinĆcio.
Não hÔ admin pré-cadastrado por padrão. Para semear um, defina no .env:
SEED_ADMIN=true
SEED_ADMIN_EMAIL=admin@example.com
SEED_ADMIN_PASSWORD=uma-senha-forteO seed é ignorado quando SEED_ADMIN não é true, e as credenciais nunca são
impressas em produção.
/api/auth/refresh valida o refresh token, invalida o token usado e emite um novo
par (rotação). Reutilizar um refresh token jÔ rotacionado retorna 401. /api/auth/logout
revoga o refresh token informado. Os jti vÔlidos ficam num store em memória que,
como o repositório de usuĆ”rios, Ć© reiniciado a cada restart do processo ā troque por
Redis/banco numa implementação real.
docker compose up --build # ajuste os segredos JWT no docker-compose.yml antes# login (use as credenciais do seu seed, se habilitado)
curl -X POST localhost:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"uma-senha-forte"}'
# usar o token
curl localhost:3000/api/auth/me -H "Authorization: Bearer <accessToken>"O projeto usa um repositório em memória por padrão (zero setup). Para produção, hÔ um prisma/schema.prisma pronto:
npm i @prisma/client && npm i -D prisma- Configure
DATABASE_URLno.env npx prisma migrate dev- Implemente
UserRepository(src/db/repository.ts) usando o Prisma Client
A interface UserRepository garante que nenhum serviƧo precisa mudar.
src/
āāā env.ts # variĆ”veis validadas com Zod
āāā app.ts / server.ts # app Express + bootstrap
āāā lib/ # jwt, password, errors
āāā db/repository.ts # camada de dados (plugĆ”vel)
āāā middleware/ # auth, authorize (RBAC), validate, errors
āāā modules/auth/ # register, login, refresh, me
āāā modules/users/ # CRUD com RBAC
āāā docs/openapi.ts # spec OpenAPI
MIT Ā© Samuel Ferreira