Criação de APIs Robústas com FastAPI e Autenticação Avançada em Python

FastAPI é um framework moderno para criação de APIs em Python, focado em alta performance, tipagem estática e facilidade de manutenção. Combinado com autenticação avançada, ele permite construir APIs seguras e escaláveis.


1. Estrutura Básica de uma API com FastAPI

from fastapi import FastAPI

app = FastAPI()

@app.get("/ping")
async def ping():
    return {"message": "pong"}
  • @app.get("/rota") define endpoints HTTP

  • Funções assíncronas (async def) permitem concurrency nativa


2. Modelos e Validação de Dados

  • FastAPI integra Pydantic para validação de dados:

from pydantic import BaseModel

class Usuario(BaseModel):
    username: str
    email: str
    is_active: bool = True

@app.post("/usuarios/")
async def criar_usuario(usuario: Usuario):
    return usuario
  • Tipagem estática garante validação automática e documentação OpenAPI.


3. Autenticação Avançada

3.1 Autenticação JWT

  • JWT (JSON Web Tokens) permite stateless authentication:

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt

SECRET_KEY = "segredo_super_secreto"
ALGORITHM = "HS256"

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

def validar_token(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        usuario = payload.get("sub")
        if usuario is None:
            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
        return usuario
    except JWTError:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
  • Tokens contêm informações do usuário e podem ser verificados sem consultar banco de dados.


3.2 Endpoint de Login

from datetime import datetime, timedelta

def criar_token(data: dict, expires_delta: timedelta):
    to_encode = data.copy()
    expire = datetime.utcnow() + expires_delta
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

@app.post("/token")
async def login(username: str, password: str):
    # valida usuário (ex: banco de dados)
    if username == "admin" and password == "123":
        token = criar_token({"sub": username}, expires_delta=timedelta(minutes=30))
        return {"access_token": token, "token_type": "bearer"}
    raise HTTPException(status_code=400, detail="Usuário ou senha inválidos")

3.3 Protegendo Endpoints

@app.get("/usuarios/me")
async def ler_usuario_atual(usuario: str = Depends(validar_token)):
    return {"usuario": usuario}
  • Depends(validar_token) exige token válido antes de acessar o endpoint.


4. Autenticação OAuth2 e Roles

  • FastAPI suporta OAuth2 scopes, permitindo controle de permissões:

from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token", scopes={"admin": "Acesso de administrador"})

@app.get("/admin")
async def admin_area(usuario: str = Depends(validar_token)):
    if "admin" not in usuario.scopes:
        raise HTTPException(status_code=403, detail="Permissão negada")
  • Permite controle refinado de acesso por função.


5. Boas Práticas para APIs Profissionais

  1. Versionamento de API (/v1/usuarios) para compatibilidade futura.

  2. Rate limiting para proteger endpoints contra abuso:

    • Usar Redis ou FastAPI-Limiter

  3. Documentação automática com OpenAPI e Swagger (/docs)

  4. CORS configurado para segurança em front-ends externos:

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://meusite.com"],
    allow_methods=["*"],
    allow_headers=["*"],
)
  1. Logging estruturado para monitoramento de requisições e erros.

  2. Teste automatizado usando pytest + HTTPX.

  3. Deploy seguro com HTTPS, containers ou PaaS.


6. Segurança Avançada

  • Proteção contra brute force: limitar tentativas de login.

  • Expiração de token e refresh token para controle de sessão.

  • Hash de senhas com bcrypt ou passlib.

from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

senha_hash = pwd_context.hash("minha_senha")
pwd_context.verify("minha_senha", senha_hash)

7. Escalabilidade e Performance

  • FastAPI + Uvicorn / Gunicorn para multi-worker:

gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
  • Asynchronous endpoints permitem alta concorrência em I/O-bound.

  • Integração com Redis ou RabbitMQ para tasks assíncronas.


8. Aplicações Profissionais

  • APIs web e mobile com autenticação JWT/OAuth2

  • Microservices distribuídos

  • Plataformas financeiras com controle de permissões e auditoria

  • Sistemas de IoT que exigem alta performance e escalabilidade

  • Plataformas SaaS com múltiplos usuários e roles


9. Conclusão

  • FastAPI permite criar APIs robustas, seguras e de alto desempenho.

  • Técnicas avançadas incluem:

    • JWT, OAuth2, roles e scopes

    • Rate limiting e CORS

    • Logging e monitoramento

    • Asynchronous endpoints para alta concorrência

  • Seguindo boas práticas, é possível criar APIs profissionais, escaláveis e seguras, prontas para ambientes de produção.

Comentários

Postagens mais visitadas deste blog

Laços de Repetição em Python: Conceitos e Exemplos Práticos

Manipulação de Arquivos no C#: Como Ler, Escrever e Trabalhar com Arquivos de Forma Simples

Como Instalar o Xamarin com C#: Passo a Passo Completo