Flask-Login: autenticação de usuários em Python
Sessions, cookies assinados, user_loader e decorators: um guia completo para proteger suas rotas.
O que é o Flask-Login?
O Flask-Login é uma extensão do Flask que gerencia sessões de usuário. Ele cuida de tarefas como login, logout e proteção de rotas, sem que você precise reinventar a roda. A biblioteca trabalha com cookies assinados para manter o usuário autenticado entre requisições.
Para instalar, basta rodar:
pip install flask-login
A configuração inicial é simples:
from flask import Flask
from flask_login import LoginManager
app = Flask(__name__)
app.secret_key = "sua-chave-secreta-aqui"
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"
Como funciona a sessão
Quando um usuário faz login, o Flask-Login armazena o ID dele em um cookie assinado. A cada nova requisição, o navegador envia esse cookie de volta, e o Flask-Login usa esse ID para carregar o objeto do usuário na memória.
O cookie é assinado com a secret_key da aplicação. Isso significa que, mesmo que alguém intercepte o cookie, não consegue alterar o conteúdo sem invalidar a assinatura.
from flask_login import login_user, logout_user
@app.route("/login", methods=["POST"])
def login():
email = request.form["email"]
senha = request.form["senha"]
usuario = Usuario.query.filter_by(email=email).first()
if usuario and usuario.verificar_senha(senha):
login_user(usuario)
return redirect(url_for("dashboard"))
flash("Credenciais inválidas.")
return redirect(url_for("login"))
O user_loader: carregando o usuário
O user_loader é uma função obrigatória que você registra com o LoginManager. Ela recebe o ID do usuário (armazenado no cookie) e retorna o objeto correspondente do banco de dados.
@login_manager.user_loader
def load_user(user_id):
return Usuario.query.get(int(user_id))
Essa função é chamada em toda requisição autenticada. Por isso, é importante que ela seja rápida. Se você tem muitos usuários simultâneos, considere usar cache com Redis para evitar consultas repetidas ao banco.
O modelo de usuário
Para funcionar com o Flask-Login, seu modelo de usuário precisa implementar algumas propriedades. O jeito mais fácil é herdar de UserMixin:
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
class Usuario(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), unique=True, nullable=False)
senha_hash = db.Column(db.String(256), nullable=False)
def definir_senha(self, senha):
self.senha_hash = generate_password_hash(senha)
def verificar_senha(self, senha):
return check_password_hash(self.senha_hash, senha)
Protegendo rotas com @login_required
O decorator @login_required impede que usuários não autenticados acessem determinadas rotas. Se alguém tentar acessar sem estar logado, será redirecionado para a página de login.
from flask_login import login_required, current_user
@app.route("/dashboard")
@login_required
def dashboard():
return f"Bem-vindo, {current_user.email}!"
O objeto current_user está disponível em qualquer rota e template. Ele representa o usuário logado na sessão atual.
Conclusão
O Flask-Login resolve o problema de autenticação de forma simples e segura. Com poucas linhas de código, você tem sessões baseadas em cookies assinados, proteção de rotas e acesso ao usuário logado em qualquer parte da aplicação. O próximo passo é combinar isso com cache (usando Redis, por exemplo) para ganhar performance em produção.