Reusable Django OTP Authentication
Project description
Django DRF OTP Auth
A reusable Django app for email-based One-Time Password (OTP) authentication, designed for Django REST Framework (DRF) and integrated with dj-rest-auth.
Why OTP?
Passwords are a pain. Users forget them, reuse them, and they are a prime target for attackers. Storing them securely is a liability.
Django DRF OTP Auth solves this by eliminating passwords entirely:
- 🧠 No Memory Required: Users don't need to remember complex passwords.
- 💾 Zero Password Storage: You don't have to worry about hashing, salting, or leaking passwords.
- 🔄 Simplified Flows: No more "Forgot Password" or "Reset Password" complexity.
- 🛡️ Enhanced Security: OTPs are short-lived and one-time use.
Features
- 🔐 Secure OTP Generation: Cryptographically secure 6-character alphanumeric codes.
- ⚡ Cache-Backed: Fast and reliable storage for OTPs with automatic expiration (default 5 minutes).
- 📧 Email Delivery: Integrated email sending using Django's email backend.
- 🔌 DRF Integration: Ready-to-use API views for requesting and verifying OTPs.
- 🎫 JWT Support: Seamlessly integrates with
dj-rest-authto issue JWTs upon verification. - ⚙️ Configurable: Customizable project name, email templates, and throttling.
- 🛡️ Throttling: Built-in support for
ScopedRateThrottleto prevent abuse.
Installation
pip install django-drf-otp-auth
Or using uv:
uv add django-drf-otp-auth
Configuration
1. Add to INSTALLED_APPS
Add django_otp_auth to your INSTALLED_APPS in settings.py:
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework.authtoken',
'dj_rest_auth',
'django_otp_auth',
...
]
2. Configure REST Framework & Auth
Ensure you have dj-rest-auth and simplejwt configured:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
),
'DEFAULT_THROTTLE_RATES': {
'otp_request': '5/hour',
'otp_verify': '10/hour',
}
}
REST_AUTH = {
'USE_JWT': True,
'JWT_AUTH_COOKIE': 'access-token',
'JWT_AUTH_REFRESH_COOKIE': 'refresh-token',
}
3. Email Configuration
Configure your email backend in settings.py:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.example.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'user@example.com'
EMAIL_HOST_PASSWORD = 'password'
DEFAULT_FROM_EMAIL = 'Your App <noreply@example.com>'
4. Optional Settings
| Setting | Description | Default |
|---|---|---|
OTP_AUTH_PROJECT_NAME |
Project name used in emails | 'Lifetivation' |
Usage
URL Configuration
Include the URLs in your project's urls.py:
from django.urls import path, include
from django_otp_auth.views import RequestOTPView, VerifyOTPView
urlpatterns = [
# ...
path('auth/otp/request/', RequestOTPView.as_view(), name='otp_request'),
path('auth/otp/verify/', VerifyOTPView.as_view(), name='otp_verify'),
# ...
]
API Endpoints
1. Request OTP
POST /auth/otp/request/
Request a new OTP to be sent to the user's email.
Payload:
{
"email": "user@example.com"
}
Response:
{
"message": "OTP sent successfully"
}
2. Verify OTP
POST /auth/otp/verify/
Verify the received OTP. If successful, returns JWT access and refresh tokens (and sets them in cookies if configured).
Payload:
{
"email": "user@example.com",
"otp": "ABC123"
}
Response:
{
"access": "eyJhbGciOiJIUzI1NiIsIn...",
"user": {
"pk": 1,
"email": "user@example.com",
...
}
}
Customization
Email Templates
You can override the email templates by creating the following files in your project's templates directory:
templates/emails/otp_email.htmltemplates/emails/otp_email.txt
Context available:
otp: The generated OTP code.project_name: The value ofOTP_AUTH_PROJECT_NAME.
Development
To run tests locally using uv:
uv run pytest
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_drf_otp_auth-0.1.1.tar.gz.
File metadata
- Download URL: django_drf_otp_auth-0.1.1.tar.gz
- Upload date:
- Size: 17.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
167680fd4a0ec166ef94414024a2a36aa7fcac6b19d871ff3fb21494137f73bb
|
|
| MD5 |
be17a521172e5c698e05248a4c22633a
|
|
| BLAKE2b-256 |
ac5b1aaa624b182d563a1106553276ca90cd499f26b3812903abbd5a226f1203
|
File details
Details for the file django_drf_otp_auth-0.1.1-py3-none-any.whl.
File metadata
- Download URL: django_drf_otp_auth-0.1.1-py3-none-any.whl
- Upload date:
- Size: 7.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
268135c39b84f1e95aae1b3a87d6206db2d4a499d785ae5a6eac099c59cef57f
|
|
| MD5 |
dca38648ed5992085d68dc9839b5e7b2
|
|
| BLAKE2b-256 |
70fcccdfd71e27d983ee1fb8b4c714fc0968da76760b5626f6f45189fdc83fed
|