API de autenticação simples construída com Express 5, TypeScript, TypeORM (PostgreSQL), JWT, Zod e bcrypt.
API responsável por autenticação e gestão de usuários com proteção por JWT. Inclui hash automático de senhas, validação de entrada com Zod e tratamento centralizado de erros.
| Tecnologia | Versão | Descrição |
|---|---|---|
| Node.js | 20+ | Runtime JavaScript (ESM) |
| Express | 5.1.0 | Framework web |
| TypeScript | 5.9.3 | Tipagem estática |
| TypeORM | 0.3.27 | ORM para PostgreSQL |
| PostgreSQL | 17 | Banco de dados relacional |
| JSON Web Token | 9.0.2 | Autenticação por token |
| Bcryptjs | 3.0.2 | Hash de senhas |
| Zod | 4.1.12 | Validação de dados |
| tsx | 4.20.6 | Executor TypeScript |
| Biome | 2.2.5 | Linter e formatter |
src/app.ts # bootstrap do Express server
src/routes.ts # definição das rotas
src/controller/ # controladores (auth, user)
src/middlewares/ # middleware de autenticação
src/app/models/ # entidades TypeORM
src/database/ # conexão e migrações
src/config/ # configuração de ambiente
src/errors/ # erros customizados
client.http # exemplos de requisição
Crie um arquivo .env na raiz do projeto:
# Banco de Dados
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=postgres
DB_NAME=express_auth
# JWT
SECREY_KEY=uma_chave_bem_secreta
# App (opcional)
PORT=3000Observações:
- A variável está escrita como
SECREY_KEY(sem o "T") para refletir o código atual PORTé opcional; o padrão é 3000
Suba um PostgreSQL com Docker:
docker compose up -dO compose utiliza as variáveis DB_USER, DB_PASSWORD, DB_NAME e mapeia a porta DB_PORT.
Desenvolvimento:
pnpm install
pnpm devProdução:
pnpm install
pnpm typeorm migration:run
pnpm devA API inicia em http://localhost:3000 (ou na porta definida em PORT).
Base URL: http://localhost:3000
| Método | Rota | Descrição | Autenticação |
|---|---|---|---|
POST |
/users |
Cria um usuário | ❌ |
POST |
/auth |
Autentica e retorna JWT | ❌ |
GET |
/users |
Rota protegida (retorna userId) | ✅ |
- Header:
Authorization: Bearer <token> - Middleware:
authMiddleware— valida JWT e injetareq.userId - Token expira em 1 dia
src/
├── app.ts # Inicialização do servidor
├── routes.ts # Definição das rotas
├── app/models/
│ └── user.ts # Entidade User (hash automático)
├── controller/
│ ├── auth-controller.ts # Autenticação
│ └── user-controller.ts # Gestão de usuários
├── middlewares/
│ └── auth-middleware.ts # Validação JWT
├── database/
│ ├── connect.ts # Data source TypeORM
│ └── migrations/ # Migrações do banco
├── config/
│ └── env.ts # Configuração de ambiente
├── errors/ # Erros customizados
└── error-handler.ts # Tratamento centralizado
- Hash de senha:
bcryptjscom salt de 8 rounds (hooks@BeforeInsert/@BeforeUpdate) - Validação: Zod para entrada de dados
- Erros: Tratamento centralizado com códigos customizados
- JWT: Token com
iddo usuário, expira em 1 dia - TypeORM: Migrações automáticas e hooks de entidade