Para sistemas modernos, autenticação não é apenas "validar usuário e senha". É sobre garantir persistência segura, performance e rastreabilidade.
Neste exemplo, implementamos um fluxo completo utilizando FastAPI, MongoDB, JWT, Redis e Middleware.
Componentes chaves da solução
-
Dual Token Strategy (Access e Refresh):
- Access Token: Curta duração, enviado via Header ou Cookie para autorizar requisições.
- Refresh Token: Longa duração, armazenado via HttpOnly para gerar novos access tokens com segurança.
- Middleware de Autenticação: Camada que intercepta as requisições e valida os tokens, liberando automaticamente as rotas públicas (/login, /docs, /health).
- Token Blacklist (Redis): Gerenciamento de estado para tokens revogados durante o logout, impedindo ataques de replay.
- Login Activity Tracking: Captura rica de dados do ambiente (Dispositivo, Navegador, SO, IP) usando device-detector para auditoria e segurança.
Fluxo de Login (Passo a Passo)
- Requisição de Login: O cliente envia email e password. O AuthService valida as credenciais no MongoDB.
- Geração e Persistência: O JwtService gera os tokens. Eles são injetados na resposta como Cookies HttpOnly, uma barreira crucial contra ataques XSS. 3.Registro de Atividade: O LoginActivityService analisa o 'User-Agent' e salva o snapshot do acesso (dispositivo e localização).
- Middleware em Ação: Em cada rota protegida, o Middleware extrai o token, verifica se não está na Blacklist do Redis, valida o usuário e o anexa ao request.state.
- Ciclo de Refresh: Quando o Access Token expira, o endpoint /refresh-access-token valida o Refresh Token e emite um novo par, mantendo a UX sem interrupções.
Conclusão
Este fluxo foi pensado para ambientes reais de produção, indo muito além do básico de tutoriais.
A combinação de Stateless JWT com Stateful Blacklist (Redis) oferece o melhor dos dois mundos: escalabilidade e controle.
Na próxima parte, falaremos sobre autorização baseada em Roles & Permissions.
Código Fonte: https://github.com/ortiz-python-templates/python-mongodb-api

Top comments (0)