Autenticação e Login com Flask e Django em Python

autenticação de usuários é um dos pilares do desenvolvimento web moderno. Permite que um sistema reconheça usuários, controle acessos e personalize experiências. Em Python, Flask e Django oferecem formas de implementar login, cada uma com seu nível de complexidade e recursos integrados.

Neste artigo, você vai aprender:

  • Conceitos básicos de autenticação

  • Implementação de login e registro de usuários no Flask

  • Implementação de login e registro de usuários no Django

  • Dicas de segurança essenciais

  • Próximos passos para sistemas mais avançados


Conceitos Básicos de Autenticação

Antes de entrar no código, é importante entender alguns conceitos:

  1. Autenticação: Processo de verificar a identidade do usuário (ex.: login com senha).

  2. Autorização: Controle do que cada usuário pode acessar após a autenticação.

  3. Sessões: Forma de manter o usuário logado durante a navegação.

  4. Hash de senhas: Senhas nunca devem ser armazenadas em texto puro; sempre use hashing seguro (ex.: bcrypt).


Autenticação com Flask

Flask não possui um sistema de autenticação nativo, mas com a extensão Flask-Login, podemos implementar login de forma simples e segura.

1. Instalação

pip install flask flask-login flask-bcrypt flask-wtf

2. Estrutura do Projeto

flask_auth/
│── app.py
│── models.py
│── templates/
│    ├── login.html
│    ├── register.html
│    ├── home.html

3. Criando o Modelo de Usuário (models.py)

from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash

class User(UserMixin):
    def __init__(self, id, username, password):
        self.id = id
        self.username = username
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

# Simulando banco de dados
users = {}

4. Configuração do Flask com Flask-Login (app.py)

from flask import Flask, render_template, redirect, url_for, request, flash
from flask_login import LoginManager, login_user, login_required, logout_user, current_user
from models import User, users

app = Flask(__name__)
app.secret_key = "supersecretkey"

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"

@login_manager.user_loader
def load_user(user_id):
    return users.get(int(user_id))

5. Rotas de Registro e Login

@app.route("/register", methods=["GET", "POST"])
def register():
    if request.method == "POST":
        username = request.form["username"]
        password = request.form["password"]
        user_id = len(users) + 1
        users[user_id] = User(user_id, username, password)
        flash("Usuário registrado com sucesso!")
        return redirect(url_for("login"))
    return render_template("register.html")

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        username = request.form["username"]
        password = request.form["password"]
        user = next((u for u in users.values() if u.username == username), None)
        if user and user.check_password(password):
            login_user(user)
            return redirect(url_for("home"))
        flash("Usuário ou senha incorretos.")
    return render_template("login.html")

@app.route("/home")
@login_required
def home():
    return render_template("home.html", username=current_user.username)

@app.route("/logout")
@login_required
def logout():
    logout_user()
    flash("Desconectado com sucesso!")
    return redirect(url_for("login"))

if __name__ == "__main__":
    app.run(debug=True)

✅ Com isso, você tem um sistema básico de login e registro com Flask.


Autenticação com Django

Diferente do Flask, o Django já vem com um sistema de autenticação completo, incluindo models, views e templates padrão.

1. Configuração do Projeto

django-admin startproject myblog
cd myblog
python manage.py startapp accounts

No settings.py:

INSTALLED_APPS = [
    ...,
    'accounts',
]

2. URLs de Login/Logout (accounts/urls.py)

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    path("login/", auth_views.LoginView.as_view(template_name="login.html"), name="login"),
    path("logout/", auth_views.LogoutView.as_view(next_page="/login/"), name="logout"),
    path("register/", views.register, name="register"),
]

Inclua em myblog/urls.py:

from django.urls import path, include

urlpatterns = [
    path("", include("accounts.urls")),
]

3. View de Registro (accounts/views.py)

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages

def register(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Conta criada com sucesso!")
            return redirect("login")
    else:
        form = UserCreationForm()
    return render(request, "register.html", {"form": form})

4. Templates Básicos

login.html:

<h2>Login</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
</form>
<a href="{% url 'register' %}">Criar conta</a>

register.html:

<h2>Registrar</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Registrar</button>
</form>
<a href="{% url 'login' %}">Login</a>

✅ Com isso, você tem um sistema de autenticação seguro e pronto para produção no Django.


Dicas de Segurança

  1. Use HTTPS para proteger dados de login.

  2. Nunca armazene senhas em texto puro (Flask: bcrypt, Django já faz hashing).

  3. Proteja contra ataques de força bruta (limite tentativas de login).

  4. Use tokens CSRF (Django já inclui, Flask-WTF para Flask).

  5. Mantenha bibliotecas atualizadas para evitar vulnerabilidades.


Próximos Passos

  • Adicionar recuperação de senha e redefinição via e-mail.

  • Implementar autorização baseada em papéis.

  • Criar painéis de administração personalizados.

  • Integrar OAuth2 para login via Google, GitHub ou Facebook.


Conclusão

Autenticação é essencial em qualquer aplicação web.

  • Com Flask, você tem flexibilidade e aprende a construir tudo do zero.

  • Com Django, você ganha produtividade e segurança embutida, ideal para aplicações robustas.

💡 Desafio prático: Adicione um recurso de “lembrar-me” e uma página de perfil de usuário em ambos os frameworks.

Comentários

Postagens mais visitadas deste blog

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

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

Gerando Relatórios em PDF com Python (ReportLab e FPDF)