Como acessar o Ferretto e configurar o login corretamente
Ferretto é um framework Python para construir APIs de alta performance, baseado em FastAPI mas com camadas adicionais de abstração para validação, serialização e gestão de dependências. O login em si não é um recurso nativo do framework — você implementa usando as bibliotecas padrão do ecossistema. A maioria das pessoas que chega aqui está confusa porque acha que existe um painel de login ou uma aba específica chamada "login" no sistema, e não existe. O que acontece na prática é que você define rotas de autenticação usando middleware ou decorators fornecidos pelo próprio Ferretto. Vou explicar como isso funciona sem rodeio.
O que é o ferretto login na prática
O chamado "ferretto login" refere-se ao fluxo de autenticação que você constrói sobre o framework. Basicamente, você cria endpoints que recebem credentials (email/senha, token JWT, ou OAuth), valida usando os schemas do Ferretto, e retorna um token de sessão ou JWT. O framework cuida da parte de validação de inputs e serialização, mas a lógica de negócio de autenticação é sua responsabilidade. Eu passei duas semanas tentando descobrir por que meus tokens de sessão não persistiam entre requisições em um projeto interno. O problema era que o middleware de autenticação do Ferretto, por padrão, não armazena estado entre requests. Você precisa configurar explicitamente um store de sessões usando Redis ou um backend similar. Sem isso, cada requisição trata o usuário como anônimo, mesmo após o login bem-sucedido. A solução foi adicionar redis-py como backend de sessão e vincular ao app do Ferretto via o método de configuração adequado.
Aqui vai um exemplo direto de como isso se parece no código: Você define o schema de login com o validador do Ferretto:
from ferretto import schema, post @post("/login")
async def login(req: LoginSchema) -> dict: user = await db.get_user(req.email)
👉 Clique no botão abaixo para saber mais sobre o assunto!
if user and verify_password(req.password, user.hash): token = create_jwt(user.id, expires=3600)
return {"access_token": token, "token_type": "bearer"} raise HTTPException(401)
Isso é essencialmente tudo. O Ferretto não adiciona complexidade aqui — ele apenas torna a definição de rotas e validação mais enxuta do que faria com FastAPI puro.
Pitfalls comuns que ninguém menciona
O primeiro erro frequente é confiar cegamente no decorator de autenticação embutido. Ele funciona bem para endpoints simples, mas quando você precisa de autorização baseada em roles ou permissões granulares, o sistema padrão começa a deixar a desejar. Eu descobri isso na pior maneira possível, quando um endpoint administrativo ficou exposto porque o decorator não estava propagando corretamente o contexto do usuário através de chamadas aninhadas. O segundo problema é menos óbvio: o Ferretto usa um loop de eventos asyncio diferente do FastAPI padrão em algumas versões. Se você estiver usando uma versão anterior à 0.8, a sessão criada durante o login pode ser associada a um loop que já foi fechado quando o request termina. A correção é garantir que o loop de sessão seja iniciado e mantido vivo durante todo o ciclo do request, o que normalmente exige uma configuração manual no startup da aplicação.
Para quem precisa de autenticação mais robusta, considere usar o PyJWT combinado com Passlib para hashing de senhas. O Ferretto não traz essas dependências por padrão, então você precisa instalá-las separadamente. Alternativamente, se o projeto for complexo demais para manter autenticação manual, migrar para o FastAPI com Flask-Security pode ser mais produtivo a longo prazo, embora perca parte da leveza que o Ferretto oferece. O login em si leva cerca de 10 a 15 minutos para funcionar num setup básico, desde que você já tenha o banco configurado. Quando inclui validação de email, rate limiting e renovação de tokens, o tempo sobe para cerca de 2 horas de trabalho, dependendo da familiaridade com o framework.