Capítulo 6.5: Fundamentos de Segurança da API
Tempo de estudo: 45 minutos
1. Segurança da API: Defesa Multinível da Estação
Imagine que sua estação espacial (API) está em um setor hostil do espaço. Um único campo de força (autenticação) não é suficiente. Você precisa de um sistema de defesa abrangente:
- Escudos (HTTPS): Criptografia de todo o tráfego.
- Sensores de Anomalias (Rate Limiting): Proteção contra solicitações excessivamente frequentes.
- Compartimentos Internos (Autorização): Separação de direitos de acesso.
- Verificação de Cargas (Validação): Não confiar em nenhum dado de entrada.
- Cofre Secreto (Variáveis de Ambiente): Armazenamento seguro de chaves.
Vamos configurar cada um desses níveis.
2. Escudos: Sempre use HTTPS
O que é? HTTPS (HyperText Transfer Protocol Secure) é uma versão do protocolo HTTP que criptografa todos os dados entre o cliente e o servidor. Sem ele, qualquer pessoa que esteja "escutando" a rede (por exemplo, em um Wi-Fi público) pode interceptar logins, senhas e tokens.
Como implementar?
- Em produção — obrigatório. Ao implantar sua API em um servidor real (Heroku, DigitalOcean, etc.), configure o servidor web (Nginx, Apache) para trabalhar com um certificado SSL. Serviços como o Let's Encrypt fornecem certificados gratuitos.
- No desenvolvimento local é menos crítico, mas ferramentas como Laravel Herd ou mkcert permitem configurar facilmente o HTTPS local.
💡 Regra nº1 em segurança da API: Sem HTTPS — sem segurança.
3. Sensores de Anomalias: Limitação de Frequência de Requisições (Rate Limiting)
O que é? Proteção contra ataques de força bruta (quando um invasor tenta adivinhar uma senha enviando milhares de solicitações por segundo) e contra ataques DoS (quando o servidor é "sobrecarregado" com solicitações para que pare de responder). O Rate Limiting limita o número de solicitações que um usuário (ou endereço IP) pode fazer em um determinado período de tempo.
Como implementar?
-
No Laravel: O Middleware de limitação já está integrado! Abra
Isso significa: 60 requisições por minuto por usuário (se autenticado) ou por endereço IP.app/Http/Kernel.php
e veja a chavemiddlewareGroups['api']
. Lá você já encontrará'throttle:api'
. As configurações dessa limitação estão emapp/Providers/RouteServiceProvider.php
no métodoconfigureRateLimiting()
. -
No FastAPI: É usado um pacote de terceiros, por exemplo,
slowapi
. -
Instalação:
pip install slowapi
- Integração em
main.py
:# main.py from slowapi import Limiter, _rate_limit_exceeded_handler from slowapi.util import get_remote_address from slowapi.errors import RateLimitExceeded limiter = Limiter(key_func=get_remote_address) app = FastAPI(...) # Conecta o manipulador de erros e o próprio limitador app.state.limiter = limiter app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) # Aplica a um endpoint específico @router.get("/planets") @limiter.limit("5/minute") # 5 requisições por minuto def get_planets(request: Request): # ...
4. Compartimentos Internos: Autorização (não confundir com autenticação!)
O que é?
- Autenticação responde à pergunta "Quem é você?".
- Autorização responde à pergunta "O que você tem permissão para fazer?".
Por exemplo, um usuário comum pode visualizar planetas, mas apenas um usuário com a função de "administrador" pode excluí-los.
Como implementar?
-
No Laravel: São utilizadas Policies (Políticas) ou Gates (Portões).
-
Criamos uma política:
php artisan make:policy PlanetPolicy --model=Planet
- Descrevemos as regras em
app/Policies/PlanetPolicy.php
: -
Aplicamos a política no controlador
PlanetController.php
: -
No FastAPI: A lógica de autorização geralmente é escrita manualmente dentro dos endpoints, usando informações do usuário obtidas do token.
# (assumimos que o token contém um campo 'roles')
def get_current_active_user(token: str = Depends(oauth2_scheme)):
# ... decodificamos o token e obtemos o usuário com as funções do DB
# user = get_user_from_db(username)
return user # retorna o objeto do usuário
@router.delete("/planets/{planet_id}")
def delete_planet(
planet_id: int,
current_user: User = Depends(get_current_active_user)
):
if "admin" not in current_user.roles:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Permissões insuficientes para executar esta operação",
)
# ... lógica de exclusão ...
5. Verificação de Cargas e Cofre Secreto: Validação e Variáveis de Ambiente
Estes dois pontos já implementamos, mas é importante destacar seu papel na segurança.
-
Nunca confie em dados de entrada (Validação):
-
Usamos
$request->validate()
no Laravel e modelos Pydantic no FastAPI. Isso nos protege de injeções SQL (ao usar Eloquent/SQLAlchemy) e dados incorretos que podem quebrar a aplicação. Sempre valide tudo o que vem de fora! -
Armazene segredos em
.env
(Variáveis de Ambiente): -
Chaves de banco de dados, chaves secretas para JWT (
SECRET_KEY
), chaves de serviços de terceiros — tudo isso nunca deve ir para o sistema de controle de versão (Git). Para isso, existem os arquivos.env
, que são adicionados ao.gitignore
.
Questionário para fixação
🚀 Conclusão do Curso Parabéns, comandante! Você concluiu com sucesso todas as missões.
Você percorreu o caminho de um novato que apenas ouviu falar de APIs para um engenheiro capaz de projetar, desenvolver, documentar, proteger e testar de forma independente um serviço web completo usando as duas tecnologias mais populares em seus ecossistemas.
Você dominou a linguagem universal REST, aprendeu Laravel e FastAPI e construiu um "Centro de Controle de Voo" para eles em JavaScript puro.
Esta é uma conquista enorme. O mundo do desenvolvimento de APIs está agora aberto para você. Continue a explorar, aprender e construir coisas incríveis.
Fim da comunicação. 🚀
☄ Apoie a missão
Criar este tutorial é um voo longo e complexo que exige muito tempo e energia. Se o material foi útil para você, pode ajudar a reabastecer os tanques de combustível da nossa expedição. Cada apoio é mais uma órbita em direção a novos materiais úteis.