- Custom User model with email as unique identifier (AUTH_USER_MODEL) - POST /api/auth/register/ with email validation, password min 8 chars, duplicate rejection - POST /api/auth/login/ returning JWT (access + refresh) tokens - Passwords hashed via Django's make_password - React LoginPage and RegisterPage with form validation - AuthContext with useReducer for auth state management - Axios API client with JWT token injection - TypeScript conversion of frontend scaffold
42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
from typing import Any
|
|
|
|
from rest_framework import status
|
|
from rest_framework.decorators import api_view, permission_classes
|
|
from rest_framework.permissions import AllowAny
|
|
from rest_framework.request import Request
|
|
from rest_framework.response import Response
|
|
|
|
from accounts.serializers import LoginSerializer, RegisterSerializer, UserSerializer
|
|
|
|
|
|
@api_view(["POST"])
|
|
@permission_classes([AllowAny])
|
|
def register_view(request: Request) -> Response:
|
|
"""Register a new user account."""
|
|
serializer = RegisterSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
user = serializer.save()
|
|
return Response(
|
|
UserSerializer(user).data,
|
|
status=status.HTTP_201_CREATED,
|
|
)
|
|
|
|
|
|
@api_view(["POST"])
|
|
@permission_classes([AllowAny])
|
|
def login_view(request: Request) -> Response:
|
|
"""Authenticate a user and return JWT tokens."""
|
|
serializer = LoginSerializer(
|
|
data=request.data,
|
|
context={"request": request},
|
|
)
|
|
serializer.is_valid(raise_exception=True)
|
|
validated_data: dict[str, Any] = serializer.validated_data
|
|
return Response(
|
|
{
|
|
"user": UserSerializer(validated_data["user"]).data,
|
|
"access": validated_data["access"],
|
|
"refresh": validated_data["refresh"],
|
|
},
|
|
status=status.HTTP_200_OK,
|
|
) |