<< All versions
Skill v1.0.1
currentAutomated scan100/100mte90/dotfiles/django-allauth
+1 new
──Details
PublishedSeptember 8, 2026 at 03:43 PM
Content Hashsha256:bf7aaa57ca693cba...
Git SHA42317ab61feb
Bump Typepatch
──Files
Files (1 file, 12.1 KB)
SKILL.md12.1 KBactive
SKILL.md · 607 lines · 12.1 KB
version: "1.0.1" name: django-allauth description: "Django authentication - local accounts, social OAuth, registration, email verification, MFA, session management" metadata: author: mte90 version: "1.0.0" tags:
- python
- django
- authentication
- oauth
- social-login
- mfa
- django-allauth
django-allauth
Django authentication package.
Overview
django-allauth is a reusable Django app for local and social authentication. It handles signup, login, logout, email verification, and integrates with many OAuth providers.
Key Features:
- Local account management (signup, login, password reset)
- OAuth providers (Google, GitHub, Facebook, etc.)
- Email verification
- Multi-factor authentication (TOTP, WebAuthn)
- Headless REST API support
- Session management
- Custom adapters
Installation
bash
pip install django-allauth# With optional dependenciespip install django-allauth[socialaccount]pip install django-allauth[mfa]
Quick Start
settings.py
python
INSTALLED_APPS = [# Required apps'django.contrib.auth','django.contrib.messages','django.contrib.sites',# allauth'allauth','allauth.account','allauth.socialaccount',]# Authentication backendsAUTHENTICATION_BACKENDS = ['allauth.account.auth_backends.AuthenticationBackend',]# Site IDSITE_ID = 1# allauth settingsACCOUNT_AUTHENTICATION_METHOD = 'email' # or 'username'ACCOUNT_EMAIL_REQUIRED = TrueACCOUNT_USERNAME_REQUIRED = FalseACCOUNT_EMAIL_VERIFICATION = 'mandatory' # or 'optional', 'none'LOGIN_REDIRECT_URL = '/'ACCOUNT_LOGOUT_REDIRECT_URL = '/'
urls.py
python
from django.urls import path, includeurlpatterns = [path('accounts/', include('allauth.urls')),]
OIDC Provider (NEW in 65.x)
python
INSTALLED_APPS = [# ... existing apps"allauth.idp.oidc", # OIDC provider]# For Django Ninja:from allauth.idp.oidc.contrib.ninja.security import TokenAuth# For DRF:from allauth.idp.oidc.contrib.rest_framework.authentication import TokenAuthentication
Local Authentication
Signup
python
# views.pyfrom allauth.account.views import SignupView# Uses built-in signup form# POST /accounts/signup/
Login
python
# POST /accounts/login/# Uses built-in login form# With remember me# POST /accounts/login/ with remember=true
Logout
python
# POST /accounts/logout/# Clears session
Password Management
python
# Password change: POST /accounts/password/change/# Password set: POST /accounts/password/set/# Password reset: POST /accounts/password/reset/# Password reset confirm: POST /accounts/password/reset/confirm/
Email Configuration
Settings
python
# Email backendEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'# allauth email settingsACCOUNT_EMAIL_NOTIFICATIONS = TrueEMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = '/'EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = '/'
Custom Email Templates
templates/account/email/├── email_confirmation_subject.txt├── email_confirmation_message.txt├── email_confirmation_signup_message.txt├── password_reset_key_message.txt└── ...
Sending Emails Manually
python
from allauth.account.models import EmailAddress# Get user's verified emailsemails = EmailAddress.objects.filter(user=user,verified=True)# Send via allauth adapterfrom allauth.account.adapter import get_adapteradapter = get_adapter()adapter.send_mail('account/email/custom_subject.txt',user,{'context': 'variables'},[user.email])
OAuth Providers
Google Setup
python
# settings.pyINSTALLED_APPS += ['allauth.socialaccount.providers.google',]# Social app in admin:# Add SocialApp with Google provider# Client ID and Secret from Google Cloud Console
GitHub Setup
python
INSTALLED_APPS += ['allauth.socialaccount.providers.github',]
Custom Provider
python
# myapp/providers.pyfrom allauth.socialaccount.providers.base import Providerfrom allauth.socialaccount.providers.oauth2.provider import ProviderMixinclass MyCustomProvider(ProviderMixin, Provider):pass# myapp/app_settings.pyfrom allauth.socialaccount import app_settingsprovider_classes = ['myapp.providers.MyCustomProvider',]# settings.pySOCIALACCOUNT_PROVIDERS = {'custom': {'APP': {'client_id': 'xxx','secret': 'xxx','key': ''}}}
Provider Settings
python
SOCIALACCOUNT_PROVIDERS = {'google': {'APP': {'client_id': 'xxx','secret': 'xxx',},'SCOPE': ['profile', 'email'],'AUTH_PARAMS': {'access_type': 'online'},},'github': {'APP': {'client_id': 'xxx','secret': 'xxx',},'SCOPE': ['user:email'],},}
Multi-Factor Authentication
Enable MFA
python
INSTALLED_APPS += ['allauth.mfa',]# SettingsMFA_ENABLED = TrueMFA_SUPPORTED_AUTHENTICATORS = ['allauth.mfa.authenticators.Totp','allauth.mfa.authenticators.WebAuthn','allauth.mfa.authenticators.RecoveryCodes',]
TOTP Setup
python
# Users can set up TOTP via# GET /mfa/totp/create/# POST /mfa/totp/activate/
WebAuthn
python
# WebAuthn/fido2 setup# GET /mfa/webauthn/create/# POST /mfa/webauthn/activate/
Recovery Codes
python
# Generate recovery codes# GET /mfa/recovery_codes/generate/
REST API (Headless)
Setup
python
INSTALLED_APPS += ['allauth.headless',]# SettingsALLAUTH_HEADLESS_ENABLED = TrueALLAUTH_HEADLESS_TOKEN_STRATEGY = 'allauth.headless.token.StrategyJWT'ALLAUTH_HEADLESS_TOKEN_JWT_SECRET_KEY = 'your-secret'ALLAUTH_HEADLESS_TOKEN_JWT_ALGORITHM = 'HS256'
Endpoints
bash
# SignupPOST /headless/signup/{"email": "user@example.com", "password": "password"}# LoginPOST /headless/authentication/login/{"email": "user@example.com", "password": "password"}# LogoutPOST /headless/authentication/logout/# Get current userGET /headless/users/me/# Manage emailsGET/POST/DELETE /headless/emails/# Manage passwordsPOST /headless/password/set/POST /headless/password/change/POST /headless/password/reset/
Token Strategies
python
# JWTALLAUTH_HEADLESS_TOKEN_STRATEGY = 'allauth.headless.token.StrategyJWT'# Session-basedALLAUTH_HEADLESS_TOKEN_STRATEGY = 'allauth.headless.token.StrategySession'
Adapters
Custom Adapter
python
# myapp/adapter.pyfrom allauth.account.adapter import DefaultAccountAdapterclass CustomAccountAdapter(DefaultAccountAdapter):def is_open_for_signup(self, request):return True # Allow signupdef send_mail(self, template_prefix, email_context, users):# Custom email sendingpassdef get_email_confirmation_redirect_url(self, request):return '/confirmed/'def authenticate(self, request, **credentials):# Custom authenticationreturn super().authenticate(request, **credentials)# settings.pyACCOUNT_ADAPTER = 'myapp.adapter.CustomAccountAdapter'
Social Account Adapter
python
# myapp/adapter.pyfrom allauth.socialaccount.adapter import DefaultSocialAccountAdapterclass CustomSocialAccountAdapter(DefaultSocialAccountAdapter):def pre_social_login(self, request, sociallogin):# Called after login, before creating userpassdef populate_user(self, request, sociallogin, data):# Populate user fieldsuser = sociallogin.useruser.first_name = data.get('first_name', '')user.last_name = data.get('last_name', '')return user# settings.pySOCIALACCOUNT_ADAPTER = 'myapp.adapter.CustomSocialAccountAdapter'
Signals
Account Signals
python
from allauth.account import signals# User signs upsignals.user_signed_up.connect(my_handler, sender=User)# User logs insignals.user_logged_in.connect(my_handler, sender=User)# Email addedsignals.email_added.connect(my_handler, sender=User)# Email confirmedsignals.email_confirmed.connect(my_handler, sender=User)# Password changedsignals.password_changed.connect(my_handler, sender=User)# Password resetsignals.password_reset.connect(my_handler, sender=User)
Social Account Signals
python
from allauth.socialaccount import signals# Social login successfulsignals.social_login.connect(my_handler, sender=SocialLogin)# Social account addedsignals.social_account_added.connect(my_handler, sender=SocialAccount)# Social account removedsignals.social_account_removed.connect(my_handler, sender=SocialAccount)# Pre-updatesignals.pre_update.connect(my_handler, sender=SocialAccount)
MFA Signals
python
from allauth.mfa import signals# MFA enabledsignals.mfa_enabled.connect(my_handler, sender=User)# MFA disabledsignals.mfa_disabled.connect(my_handler, sender=User)# Authenticator createdsignals.authenticator_created.connect(my_handler, sender=User)
Templates
Custom Templates
templates/├── account/│ ├── base.html│ ├── login.html│ ├── signup.html│ ├── logout.html│ ├── password_change.html│ ├── password_reset.html│ ├── password_set.html│ ├── email/│ │ ├── email_confirmation_subject.txt│ │ └── email_confirmation_message.txt│ └── snippets/│ └── form.html├── socialaccount/│ ├── base.html│ ├── login.html│ ├── signup.html│ ├── connections.html│ └── snippets/│ └── provider_list.html└── mfa/├── index.html├── totp.html└── webauthn.html
Template Tags
django
{% load allauth_tags %}{# Check if user is verified #}{% user_verified request.user %}{# Social account connections #}{% socialaccount_providers %}{# Login URL #}{% provider_login_url "google" %}
Best Practices
1. Use Adapter for Customization
python
# Instead of modifying allauth, use adapterACCOUNT_ADAPTER = 'myapp.adapter.CustomAccountAdapter'
2. Enable HTTPS
python
# In productionSECURE_SSL_REDIRECT = TrueSESSION_COOKIE_SECURE = TrueCSRF_COOKIE_SECURE = True
3. Rate Limiting
python
# Allauth has rate limiting built-inACCOUNT_RATE_LIMITS = {'signup': '5/hour','password_reset': '3/hour',}
4. Email Verification
python
# Require verificationACCOUNT_EMAIL_VERIFICATION = 'mandatory'# Or optionalACCOUNT_EMAIL_VERIFICATION = 'optional'
Examples
Custom Signup Form
python
# forms.pyfrom allauth.account.forms import SignupFormclass CustomSignupForm(SignupForm):first_name = forms.CharField(max_length=30)last_name = forms.CharField(max_length=30)def save(self, request):user = super().save(request)user.first_name = self.cleaned_data['first_name']user.last_name = self.cleaned_data['last_name']user.save()return user# views.pyfrom allauth.account.views import SignupViewfrom .forms import CustomSignupFormclass CustomSignupView(SignupView):form_class = CustomSignupForm# urls.pypath('accounts/signup/', CustomSignupView.as_view(), name='account_signup')
Require Verified Email
python
# myapp/middleware.pyfrom django.shortcuts import redirectfrom allauth.account.models import EmailAddressdef verified_email_required(get_response):def middleware(request):if request.user.is_authenticated:email = EmailAddress.objects.filter(user=request.user,verified=True).exists()if not email:return redirect('/accounts/verify-email/')return get_response(request)return middleware# settings.pyMIDDLEWARE += ['myapp.middleware.verified_email_required']
References
- Official Documentation: https://docs.allauth.org/
- GitHub Repository: https://github.com/pennersr/django-allauth
- Stack Overflow: https://stackoverflow.com/questions/tagged/django-allauth