This project demonstrates a Django REST API with JWT authentication (via django-rest-framework-simplejwt), including two-factor authentication (2FA). The frontend is a simple Single Page Application (SPA) built with JavaScript (Fetch API).
is_verified = False) and sends a 2FA code via email.is_verified = True.sequenceDiagram
autonumber
participant User
participant Frontend (SPA)
participant Django (Backend)
participant DB
User->>Frontend (SPA): Opens signup form (Username/Email/Password)
Frontend (SPA)->>Django (Backend): POST /api/users/register/ with {username, email, password}
Django (Backend)->>DB: Stores new user (is_verified = False)
Django (Backend)->>User: Response (User ID)
Frontend (SPA)->>Django (Backend): POST /api/users/verify/send/ with { email }
Django (Backend)->>DB: Generates verification_code, stores it
Django (Backend)->>User: Sends email with verification_code
User->>Frontend (SPA): Clicks "Verify Code" and enters code
Frontend (SPA)->>Django (Backend): POST /api/users/verify/ with { email, code }
Django (Backend)->>DB: Sets is_verified = True, deletes code
Django (Backend)->>User: "User verified!"
style User fill:#f9f,stroke:#333,stroke-width:2px
style Frontend (SPA) fill:#bbf,stroke:#333,stroke-width:2px
style Django (Backend) fill:#bfb,stroke:#333,stroke-width:2px
style DB fill:#ff9,stroke:#333,stroke-width:2px
sequenceDiagram
autonumber
participant User
participant Frontend (SPA)
participant Django (Backend)
participant DB
User->>Frontend (SPA): Opens login form (Username/Password)
Frontend (SPA)->>Django (Backend): POST /api/users/login/ (username + password)
Django (Backend)->>DB: Verifies user data and is_verified
alt is_verified == True
Django (Backend)->>Frontend (SPA): {access: <token>, refresh: <token>}
Frontend (SPA)->>LocalStorage: Stores tokens
Frontend (SPA)->>User: "Login successful"
else is_verified == False
Django (Backend)->>Frontend (SPA): Error (HTTP 400/401)
Frontend (SPA)->>User: "Login failed. User not verified."
end
style User fill:#f9f,stroke:#333,stroke-width:2px
style Frontend (SPA) fill:#bbf,stroke:#333,stroke-width:2px
style Django (Backend) fill:#bfb,stroke:#333,stroke-width:2px
style DB fill:#ff9,stroke:#333,stroke-width:2px
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver
The frontend is an SPA using pure JavaScript (Fetch API). To test it, you can:
index.html locally or serve it using python -m http.server.http://127.0.0.1:8000/api/users/...) are correct.If you encounter cross-origin issues, enable CORS (e.g., via django-cors-headers).
POST /api/users/register/{ "username": "...", "email": "...", "password": "..." }POST /api/users/verify/send/
{ "email": "..." }verification_code, stores it in the database, and sends it via email.POST /api/users/verify/
{ "email": "...", "code": "..." }is_verified = True.POST /api/users/login/{ "username": "...", "password": "..." }{ "access": "...", "refresh": "..." } or error if is_verified = False.GET /api/users/profile/
Authorization: Bearer <access-token>PUT /api/users/profile/
{ "bio": "...", "avatar": "..." }).Authorization: Bearer <access-token>is_verified = True.POST /api/users/token/refresh/).localStorage.removeItem(...)). Optionally, you can set up SimpleJWT blacklisting.