Autenticação

O que é Django Allauth?

A solução completa de autenticação para Django. Login social, registro, verificação de e-mail e recuperação de senha — tudo pronto para usar.

O que é o Django Allauth?

O django-allauth é o pacote de autenticação mais completo para Django. Ele resolve de uma vez todos os problemas comuns de autenticação: registro de usuários, login, logout, verificação de e-mail, recuperação de senha e login social (Google, GitHub, Facebook, etc.).

Nos projetos do canal, o allauth é sempre a primeira instalação após criar o projeto Django. Isso porque implementar autenticação segura do zero é complexo e sujeito a vulnerabilidades — o allauth tem anos de revisões de segurança e uma comunidade enorme. Não faz sentido reinventar a roda.

O que o Allauth oferece

  • Registro de usuários com validação completa de senha e e-mail
  • Verificação de e-mail obrigatória ou opcional antes do primeiro login
  • Login social com mais de 50 provedores (Google, GitHub, Facebook, Apple, Twitter/X, Discord...)
  • Recuperação de senha por e-mail com token seguro
  • Múltiplos e-mails por conta de usuário (primário + secundários)
  • Conexão de contas sociais a uma conta existente
  • Integração com DRF via dj-rest-auth ou modo headless nativo para APIs
  • Adaptadores customizáveis para controlar cada etapa do fluxo

Instalação

# Instalação básica
pip install django-allauth

# Para APIs com DRF (abordagem clássica):
pip install dj-rest-auth

# Para o modo headless nativo (recomendado em projetos novos):
pip install "django-allauth[headless]"

# Para JWT com dj-rest-auth:
pip install djangorestframework-simplejwt

Configuração no settings.py

INSTALLED_APPS = [
    # Apps padrão do Django
    'django.contrib.sites',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Allauth
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    # Provedores que você quer usar:
    'allauth.socialaccount.providers.google',
    'allauth.socialaccount.providers.github',

    # Para APIs (modo headless):
    'allauth.headless',     # OU instale dj-rest-auth se preferir

    # Suas apps
    'users',
    'blog',
]

SITE_ID = 1

AUTHENTICATION_BACKENDS = [
    # Permite login com username/email padrão do Django
    'django.contrib.auth.backends.ModelBackend',
    # Permite login via allauth (e-mail, provedores sociais)
    'allauth.account.auth_backends.AuthenticationBackend',
]

# Middleware necessário para allauth
MIDDLEWARE = [
    ...
    'allauth.account.middleware.AccountMiddleware',
]

# Configurações do allauth
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False          # login por e-mail, sem username
ACCOUNT_AUTHENTICATION_METHOD = 'email'   # ou 'username' ou 'username_email'
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'  # 'mandatory', 'optional', 'none'
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_SESSION_REMEMBER = True
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = True

LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

# Configuração de e-mail (desenvolvimento)
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

# Em produção, use algo como:
# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# EMAIL_HOST = 'smtp.sendgrid.net'
# EMAIL_PORT = 587
# EMAIL_USE_TLS = True
# EMAIL_HOST_USER = 'apikey'
# EMAIL_HOST_PASSWORD = env('SENDGRID_API_KEY')
# DEFAULT_FROM_EMAIL = 'noreply@meusite.com'

URLs

from django.urls import path, include

urlpatterns = [
    # Para sites com templates (não SPA):
    path('accounts/', include('allauth.urls')),

    # Para APIs com dj-rest-auth:
    path('api/auth/', include('dj_rest_auth.urls')),
    path('api/auth/registration/', include('dj_rest_auth.registration.urls')),

    # Para modo headless (allauth nativo):
    path('_allauth/', include('allauth.headless.urls')),
]

# O allauth.urls cria automaticamente:
# /accounts/login/
# /accounts/logout/
# /accounts/signup/
# /accounts/password/reset/
# /accounts/email/
# /accounts/social/login/{provider}/  ← login social

Configurar Login com Google

O processo completo para habilitar o login com Google em um projeto Django:

  1. Acesse o Google Cloud Console (console.cloud.google.com) e crie um projeto
  2. Ative a Google+ API ou People API no projeto
  3. Vá em "APIs e Serviços" → "Tela de consentimento OAuth" e configure como "Externo"
  4. Vá em "Credenciais" → "Criar credenciais" → "ID do cliente OAuth 2.0"
  5. Selecione "Aplicativo da Web" e adicione as URIs de redirecionamento autorizados:
# URIs de redirecionamento para o Google Console:
# Desenvolvimento:
http://localhost:8000/accounts/google/login/callback/

# Produção:
https://meusite.com/accounts/google/login/callback/

# Para modo headless/dj-rest-auth:
https://meusite.com/api/auth/google/

Após criar as credenciais, configure o provedor Google no settings.py (recomendado) ou via admin Django:

# settings.py — configuração via código (sem precisar do admin)
SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'SCOPE': ['profile', 'email'],
        'AUTH_PARAMS': {'access_type': 'online'},
        'APP': {
            'client_id': env('GOOGLE_CLIENT_ID'),
            'secret': env('GOOGLE_CLIENT_SECRET'),
            'key': '',
        }
    },
    'github': {
        'SCOPE': ['user:email'],
        'APP': {
            'client_id': env('GITHUB_CLIENT_ID'),
            'secret': env('GITHUB_CLIENT_SECRET'),
        }
    }
}

Se preferir configurar via admin Django, vá em "Sites" e certifique-se que o site tem o domínio correto, depois vá em "Social Applications" e adicione Google com o Client ID e Secret.

Usando com dj-rest-auth (API + JWT)

Para APIs que precisam de autenticação JWT com login social, a combinaçãodj-rest-auth + django-allauth + simplejwt é o padrão:

# settings.py
REST_USE_JWT = True
JWT_AUTH_COOKIE = 'access-token'
JWT_AUTH_REFRESH_COOKIE = 'refresh-token'
JWT_AUTH_SECURE = True   # apenas HTTPS em produção
JWT_AUTH_HTTPONLY = True  # previne acesso via JavaScript

# Configurações dj-rest-auth
REST_AUTH = {
    'USE_JWT': True,
    'JWT_AUTH_COOKIE': 'access-token',
    'JWT_AUTH_REFRESH_COOKIE': 'refresh-token',
    'JWT_AUTH_SECURE': False,  # True em produção
    'JWT_AUTH_HTTPONLY': True,
    'SESSION_LOGIN': False,
}

# Opcional: serializer customizado para o registro
REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER': 'users.serializers.CustomRegisterSerializer',
}
# Exemplo: registro + login com dj-rest-auth

# POST /api/auth/registration/
{
    "email": "usuario@exemplo.com",
    "password1": "MinhaSenh@123",
    "password2": "MinhaSenh@123"
}
# Resposta: 201 Created + envia e-mail de verificação

# POST /api/auth/login/
{
    "email": "usuario@exemplo.com",
    "password": "MinhaSenh@123"
}
# Resposta: 200 OK + cookies JWT ou:
{
    "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
    "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
    "user": {
        "id": 1,
        "email": "usuario@exemplo.com",
        ...
    }
}

Adaptadores customizados

Os Adapters são o ponto de extensão principal do allauth. Você pode customizar praticamente qualquer comportamento:

# users/adapters.py
from allauth.account.adapter import DefaultAccountAdapter
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter

class MeuAccountAdapter(DefaultAccountAdapter):
    """Customiza o comportamento de contas locais."""

    def is_open_for_signup(self, request):
        # Desabilita registro público (somente convite)
        return getattr(settings, 'ACCOUNT_ALLOW_REGISTRATION', True)

    def save_user(self, request, user, form, commit=True):
        user = super().save_user(request, user, form, commit=False)
        # Adicione campos extras ao salvar
        user.nome_completo = form.cleaned_data.get('nome_completo', '')
        if commit:
            user.save()
        return user

    def send_confirmation_mail(self, request, emailconfirmation, signup):
        # Customiza o e-mail de confirmação
        # Ex: usar um template de e-mail transacional específico
        super().send_confirmation_mail(request, emailconfirmation, signup)

class MeuSocialAccountAdapter(DefaultSocialAccountAdapter):
    """Customiza o comportamento de contas sociais."""

    def pre_social_login(self, request, sociallogin):
        # Executado antes do login social ser processado
        # Ex: conectar conta social a conta existente pelo e-mail
        if sociallogin.is_existing:
            return
        email = sociallogin.account.extra_data.get('email')
        if email:
            from django.contrib.auth import get_user_model
            User = get_user_model()
            try:
                user = User.objects.get(email=email)
                sociallogin.connect(request, user)
            except User.DoesNotExist:
                pass

    def is_open_for_signup(self, request, sociallogin):
        return True

# settings.py — registrar os adapters customizados
ACCOUNT_ADAPTER = 'users.adapters.MeuAccountAdapter'
SOCIALACCOUNT_ADAPTER = 'users.adapters.MeuSocialAccountAdapter'

Signals do Allauth

O allauth emite signals em pontos-chave do fluxo de autenticação, permitindo executar lógica customizada:

from allauth.account.signals import user_signed_up, email_confirmed
from allauth.socialaccount.signals import social_account_added
from django.dispatch import receiver

@receiver(user_signed_up)
def usuario_registrado(request, user, **kwargs):
    """Executado após o registro bem-sucedido."""
    # Enviar e-mail de boas-vindas personalizado
    # Adicionar ao plano gratuito
    # Criar dados iniciais para o usuário
    Perfil.objects.get_or_create(usuario=user)
    enviar_email_boas_vindas.delay(user.id)  # via Celery

@receiver(email_confirmed)
def email_verificado(request, email_address, **kwargs):
    """Executado após o usuário verificar o e-mail."""
    user = email_address.user
    # Ativar recursos que requerem e-mail verificado
    user.perfil.email_verificado = True
    user.perfil.save()

@receiver(social_account_added)
def conta_social_adicionada(request, sociallogin, **kwargs):
    """Executado quando uma conta social é conectada."""
    provider = sociallogin.account.provider
    # Registrar analytics, sincronizar foto de perfil, etc.

Modelo de usuário customizado

A prática recomendada é sempre criar um modelo de usuário customizado no início do projeto, antes da primeira migration. O allauth se adapta automaticamente:

# users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    """Usuário customizado — adicione campos conforme precisar."""
    email = models.EmailField(unique=True)
    nome_completo = models.CharField(max_length=200, blank=True)
    avatar = models.ImageField(upload_to='avatars/', blank=True, null=True)
    bio = models.TextField(blank=True)
    criado_em = models.DateTimeField(auto_now_add=True)

    USERNAME_FIELD = 'email'  # login por e-mail
    REQUIRED_FIELDS = ['username']  # necessário para createsuperuser

    def __str__(self):
        return self.email

    @property
    def nome_exibido(self):
        return self.nome_completo or self.username or self.email.split('@')[0]

# settings.py
AUTH_USER_MODEL = 'users.User'  # DEVE ser configurado antes da primeira migration

Perguntas Frequentes

Posso usar o Django Allauth só para login com Google?

Sim! Você pode habilitar apenas os provedores sociais que precisar. O allauth é modular, então configure apenas o Google se quiser. Basta adicionar allauth.socialaccount.providers.google à INSTALLED_APPS.

O Django Allauth funciona com Django REST Framework?

Sim, e existe o dj-rest-auth que integra allauth com DRF para APIs. Essa combinação é o padrão no canal para autenticação em APIs Django que servem frontends React/Next.js.

Como configurar o login com Google?

Você precisa criar credenciais OAuth 2.0 no Google Cloud Console, adicionar allauth.socialaccount.providers.google às INSTALLED_APPS e configurar o client_id e secret. Você pode fazer isso via admin do Django ou diretamente no settings.py com SOCIALACCOUNT_PROVIDERS.

O allauth manda e-mail de verificação automaticamente?

Sim, se configurado. Defina ACCOUNT_EMAIL_VERIFICATION = "mandatory" para exigir verificação antes do primeiro login, "optional" para enviar mas não exigir, ou "none" para desabilitar completamente.

Preciso de um template customizado para o allauth?

O allauth vem com templates básicos funcionais. Em produção com SPA (React/Next.js), você provavelmente usará o modo headless do allauth (v0.56+) ou o dj-rest-auth, que retorna JSON ao invés de renderizar templates.

O que é o modo headless do allauth?

A partir da versão 0.56, o allauth suporta modo headless nativo — as views retornam JSON puro ao invés de HTML, sem precisar do dj-rest-auth. É a abordagem mais moderna para SPAs. Instale com pip install django-allauth[headless] e adicione allauth.headless às INSTALLED_APPS.

Como customizar o modelo de usuário com allauth?

Crie um modelo User customizado que herda de AbstractUser (ou AbstractBaseUser) e defina AUTH_USER_MODEL nas settings ANTES de rodar a primeira migration. O allauth se adapta automaticamente ao modelo de usuário customizado.

O allauth suporta autenticação com GitHub?

Sim, basta adicionar allauth.socialaccount.providers.github às INSTALLED_APPS, criar um OAuth App no GitHub (Settings → Developer settings → OAuth Apps) e configurar o client_id e secret no admin ou nas settings.

Como testar o fluxo de autenticação com allauth em desenvolvimento?

Configure EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" nas settings de desenvolvimento para ver os e-mails de verificação no terminal ao invés de enviá-los. Não esqueça de mudar para um backend real (SendGrid, Mailgun, SES) em produção.