API minimalista, segura e completa desenvolvida com FastAPI utilizando SQLite, Argon2 e criptografia HTTPS nativa.
Este projeto consiste em uma API minimalista, segura e completa que demonstra o uso de FastAPI para controle de acessos com dois perfis de usuários (Admin e User). O banco de dados local utiliza SQLite e as senhas são criptografadas com Argon2-cffi, garantindo proteção moderna contra força bruta. Os endpoints de CRUD e rotas protegidas são autenticados via JWT sob uma conexão obrigatória HTTPS.
main.py: Ponto de entrada do FastAPI, definindo rotas, autenticação, controle de permissões e ciclo de vida (lifespan).database.py: Configuração do SQLAlchemy e sessão do banco de dados SQLite.models.py: Definição do modelo de banco de dados doUser.schemas.py: Esquemas de validação do Pydantic para entradas e saídas.security.py: Lógica de hash de senhas com Argon2 e emissão/leitura de tokens JWT.certificates.py: Script auxiliar para gerar certificados SSL autoassinados (cert.pem,key.pem) para testes locais em HTTPS.run.py: Script de inicialização que garante a presença dos certificados SSL e executa o servidor Uvicorn.test_main.py: Suíte de testes automatizados unitários e de integração utilizandopytestehttpx2.Dockerfile&.dockerignore: Receita para empacotar a aplicação em uma imagem Alpine 3.20 leve que roda sob usuário não-privilegiado..env&.env.example: Arquivo de configurações locais e modelo com as variáveis de ambiente necessárias.
- Ter o gerenciador de pacotes UV instalado no sistema.
Copie o arquivo de exemplo para criar seu .env local:
# No Windows (PowerShell)
Copy-Item .env.example .env
# No Linux / macOS / Git Bash
cp .env.example .envE ajuste os valores no .env caso queira mudar as configurações locais (como ativar ou desativar o modo DEBUG).
O uv gerencia o ambiente virtual automaticamente. Para executar o servidor de desenvolvimento:
uv run run.pyIsso fará com que o uv:
- Crie a pasta
ssl/e gere automaticamente os arquivoscert.pemekey.pemse eles não existirem. - Crie o banco de dados
fastapi_secured_api.dbe crie as tabelas se não existirem. - Se o banco estiver vazio, semeará uma conta Admin padrão inicial:
- Username:
admin - Password:
adminpassword123 - Email:
admin@example.com
- Username:
- Inicie o servidor Uvicorn rodando em
https://localhost:8000com auto-reload ativado.
Para executar a suíte de testes unitários e de integração (que rodam de forma isolada em um banco de dados SQLite em memória):
uv run pytestGET /health: Retorna o status da aplicação e a integridade da conexão com o banco de dados.POST /token: Recebe credenciais de login via form-data (usernameepassword) e retorna o JWT access token.
GET /secured: Endpoint restrito a usuários autenticados (User e Admin), respondendo com uma mensagem contendo as informações do seu perfil logado.GET /users/me: Retorna os dados do próprio usuário autenticado.PUT /users/me: Atualiza dados do próprio usuário. Usuários comuns são impedidos de alterar seus cargos (role) ou status de atividade (is_active).
GET /users: Lista todos os usuários cadastrados.POST /users: Cria novos usuários (comum ou administrador).GET /users/{user_id}: Busca detalhes de um usuário específico por ID.PUT /users/{user_id}: Atualiza qualquer campo de qualquer usuário (incluindoroleeis_active). Impede que o próprio admin logado se desative ou se rebaixe de cargo.PATCH /users/{user_id}/promote: Promove o usuário especificado diretamente para o cargo deadmin.DELETE /users/{user_id}: Deleta permanentemente um usuário. Impede a autoexclusão de um admin logado.
Como o servidor roda sob HTTPS autoassinado, use a flag -k ou --insecure nas chamadas cURL para aceitar o certificado local:
curl -k -X POST https://localhost:8000/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin&password=adminpassword123"curl -k https://localhost:8000/secured \
-H "Authorization: Bearer <TOKEN>"curl -k -X POST https://localhost:8000/users \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"username": "joaosilva",
"email": "joao@example.com",
"password": "senhaSegura123",
"role": "user"
}'Uma vez que o servidor estiver rodando, você pode acessar a documentação interativa e testar as chamadas diretamente do navegador:
- Swagger UI: https://localhost:8000/docs
- ReDoc: https://localhost:8000/redoc
Nota: Por se tratar de um certificado autoassinado, o navegador exibirá um alerta de segurança (ex: "Sua conexão não é particular"). Você pode clicar em "Avançado" e prosseguir para acessar a interface do Swagger com segurança.
docker build -t fastapi-secured-api .Para rodar a aplicação mapeando a porta 8000:
docker run -d --name fastapi_api -p 8000:8000 fastapi-secured-apiSe desejar persistir o banco de dados e os certificados gerados localmente na sua máquina, mapeie os volumes correspondentes:
# No Windows (PowerShell)
docker run -d --name fastapi_api -p 8000:8000 -v ${PWD}/ssl:/app/ssl -v ${PWD}:/app/data fastapi-secured-api- Nome: Roberto Lins
- E-mail: robertolins1979@gmail.com
Este projeto é de código aberto e está licenciado sob os termos da licença MIT.