Skip to content

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 app/Http/Kernel.php e veja a chave middlewareGroups['api']. Lá você já encontrará 'throttle:api'. As configurações dessa limitação estão em app/Providers/RouteServiceProvider.php no método configureRateLimiting().

    // app/Providers/RouteServiceProvider.php
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });
    }
    
    Isso significa: 60 requisições por minuto por usuário (se autenticado) ou por endereço IP.

  • 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:
    class PlanetPolicy
    {
        // Permitir a exclusão apenas para usuários com a função 'admin'
        public function delete(User $user, Planet $planet): bool
        {
            return $user->role === 'admin';
        }
    }
    
  • Aplicamos a política no controlador PlanetController.php:

    public function destroy(Planet $planet)
    {
        // Verifica se o usuário atual tem permissão para excluir
        $this->authorize('delete', $planet);
    
        $planet->delete();
        return response()->json(null, 204);
    }
    

  • 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

1. Para proteger contra a interceptação de dados em redes públicas, utiliza-se:

2. A limitação de frequência de requisições (Rate Limiting) protege principalmente contra:

3. A pergunta "O que este usuário tem permissão para fazer?" é resolvida por:

4. Chaves secretas da API e senhas de BD devem ser armazenadas:


🚀 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.

Compre-me um café em ko-fi.com