API REST desenvolvida em FastAPI para gerenciamento de usuários, com autenticação via OAuth2 + JWT, controle de permissões e persistência em PostgreSQL.
- ✅ CRUD completo de usuários
- 🔐 Autenticação com OAuth2 (Password Flow)
- 🔑 Autorização com JWT
- 🛂 Controle de permissões (usuário / superusuário)
- 🐳 Containerização com Docker
- 💾 Persistência de dados com volume Docker
- Python 3.11+
- FastAPI
- PostgreSQL 16
- Uvicorn
- Docker / Docker Compose
- JWT (python-jose)
- Passlib / Werkzeug
- Sistema operacional Linux (Ubuntu recomendado)
- Git
git clone https://github.com/luiz-oberto/user-manager-api
cd user_managerEste projeto inclui um script para instalar automaticamente o Docker e o Docker Compose Plugin.
chmod +x setup_server_docker.sh
./setup_server.shExecute:
newgrp dockerIsso permite usar Docker sem sudo.
docker --version
docker compose versionEste projeto utiliza variáveis de ambiente para configuração da aplicação.
Antes de executar o projeto, copie o arquivo de exemplo:
cp .env.example .envEdite o arquivo .env com valores reais:
DB_HOST→ Host do banco (em Docker:db)DB_NAME→ Nome do banco de dadosDB_USER→ Usuário do bancoDB_PASSWORD→ Senha do banco
SECRET_KEY→ Chave secreta para geração dos tokens (use uma chave forte)ALGORITHM→ Algoritmo de assinatura (ex:HS256)ACCESS_TOKEN_EXPIRE_MINUTES→ Tempo de expiração do token
ADMIN_EMAIL→ Email do superusuário inicialADMIN_PASSWORD→ Senha do superusuário inicial
⚠️ Caso essas variáveis não sejam definidas, a aplicação utilizará valores padrão (somente para desenvolvimento).
Execute:
openssl rand -hex 32- O serviço da API lê automaticamente o arquivo
.env - Certifique-se de que as credenciais do banco (
DB_USEReDB_PASSWORD) estão alinhadas com odocker-compose.yml
Após configurar o .env, execute:
docker compose up --buildA aplicação irá:
- Subir o banco PostgreSQL
- Iniciar a API FastAPI
- Criar automaticamente um superusuário (caso ainda não exista)
- Documentação interativa: http://IP_DA_MAQUINA:8000/docs
Endpoint:
POST /token
Body: x-www-form-urlencoded
username=Nome
password=senha
Resposta:
{
"access_token": "TOKEN_JWT",
"token_type": "bearer"
}Header:
Authorization: Bearer TOKEN_JWT
- A aplicação inicia e cria automaticamente um superusuário (caso não exista)
- O usuário realiza autenticação via
/token - Um token JWT é retornado
- O token é utilizado para acessar endpoints protegidos
- O superusuário pode gerenciar usuários no sistema
🔐 Todos os endpoints protegidos requerem token JWT no header:
Authorization: Bearer <seu_token>
POST /users
GET /users
GET /users/{id}
PUT /users/{id}
DELETE /users/{id}
curl -X POST "http://localhost:8000/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin@local&password=Admin@123"| Tipo | Permissões |
|---|---|
| Usuário comum | Visualizar próprio perfil |
| Superusuário | Gerenciar usuários |
A aplicação utiliza volume Docker:
postgres_data
Os dados permanecem mesmo após reinicialização.
docker compose down
docker compose up -ddocker compose down -v
docker compose up --buildapp/
├── routes/
├── services/
├── schemas/
├── utils/
├── database.py
├── main.py
docker/
└── db_init/
└── init.sql
- Senhas armazenadas com hash (bcrypt)
- Autenticação baseada em JWT
- Controle de acesso por nível de usuário
- Variáveis sensíveis protegidas via
.env .envnão versionado
- O banco é inicializado automaticamente na primeira execução
- JWT possui expiração configurável
- Arquitetura stateless
- Implementação de refresh token
- Deploy com Nginx e reverse proxy
- Configuração de HTTPS (TLS)
- Integração com frontend
- Controle de roles mais granular (RBAC)
Desenvolvido por Luiz Oberto Matos Raiol
Analista de TI com foco em Backend e Segurança da Informação.
Experiência em desenvolvimento de APIs, automação e infraestrutura.
Este projeto demonstra:
- Desenvolvimento de API REST com FastAPI
- Implementação de autenticação OAuth2 + JWT
- Controle de acesso baseado em permissões
- Containerização com Docker
- Integração com PostgreSQL
🔗 LinkedIn: https://www.linkedin.com/in/luiz-oberto-matos-raiol-217038283/
🔗 GitHub: https://github.com/luiz-oberto