Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save housamz/4373a85719f7fdcf7c4838f984c25f2a to your computer and use it in GitHub Desktop.
Save housamz/4373a85719f7fdcf7c4838f984c25f2a to your computer and use it in GitHub Desktop.
Creating a simple example to authenticate a React UI with a Python Django backend

Creating a simple example to authenticate a React UI with a Python Django backend.

Step 1: Set Up the Django Backend

  1. Install Django and Django Rest Framework:

    pip install django djangorestframework django-cors-headers
  2. Create a New Django Project:

    django-admin startproject myproject
    cd myproject
  3. Create a New Django App:

    python manage.py startapp authapp
  4. Configure the Django Project:

    • myproject/settings.py:

      INSTALLED_APPS = [
          ...
          'rest_framework',
          'corsheaders',
          'authapp',
      ]
      
      MIDDLEWARE = [
          ...
          'corsheaders.middleware.CorsMiddleware',
          ...
      ]
      
      CORS_ALLOWED_ORIGINS = [
          'http://localhost:3000',
      ]
      
      REST_FRAMEWORK = {
          'DEFAULT_AUTHENTICATION_CLASSES': (
              'rest_framework_simplejwt.authentication.JWTAuthentication',
          ),
      }
      
      SIMPLE_JWT = {
          'AUTH_HEADER_TYPES': ('Bearer',),
      }
    • myproject/urls.py:

      from django.contrib import admin
      from django.urls import path, include
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('api/', include('authapp.urls')),
      ]
  5. Set Up JWT Authentication:

    pip install djangorestframework-simplejwt
  6. Create API Endpoints:

    • authapp/urls.py:

      from django.urls import path
      from rest_framework_simplejwt.views import (
          TokenObtainPairView,
          TokenRefreshView,
      )
      
      from .views import RegisterView
      
      urlpatterns = [
          path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
          path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
          path('register/', RegisterView.as_view(), name='register'),
      ]
    • authapp/views.py:

      from django.contrib.auth.models import User
      from rest_framework import generics
      from rest_framework.permissions import AllowAny
      from rest_framework.response import Response
      from rest_framework_simplejwt.tokens import RefreshToken
      from rest_framework import status
      
      from .serializers import RegisterSerializer
      
      class RegisterView(generics.CreateAPIView):
          queryset = User.objects.all()
          permission_classes = (AllowAny,)
          serializer_class = RegisterSerializer
      
          def post(self, request, *args, **kwargs):
              serializer = self.get_serializer(data=request.data)
              serializer.is_valid(raise_exception=True)
              user = serializer.save()
              refresh = RefreshToken.for_user(user)
              return Response({
                  'refresh': str(refresh),
                  'access': str(refresh.access_token),
              }, status=status.HTTP_201_CREATED)
    • authapp/serializers.py:

      from django.contrib.auth.models import User
      from rest_framework import serializers
      
      class RegisterSerializer(serializers.ModelSerializer):
          password = serializers.CharField(write_only=True)
      
          class Meta:
              model = User
              fields = ('username', 'password', 'email')
      
          def create(self, validated_data):
              user = User.objects.create_user(
                  username=validated_data['username'],
                  email=validated_data['email'],
                  password=validated_data['password']
              )
              return user
  7. Migrate the Database:

    python manage.py makemigrations
    python manage.py migrate

Step 2: Set Up the React Frontend

  1. Create a New React App:

    npx create-react-app myfrontend
    cd myfrontend
  2. Install Axios for HTTP Requests:

    npm install axios
  3. Create Authentication Components:

    • src/App.js:

      import React from 'react';
      import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
      import Register from './components/Register';
      import Login from './components/Login';
      
      function App() {
        return (
          <Router>
            <div className="App">
              <Routes>
                <Route path="/register" element={<Register />} />
                <Route path="/login" element={<Login />} />
              </Routes>
            </div>
          </Router>
        );
      }
      
      export default App;
    • src/components/Register.js:

      import React, { useState } from 'react';
      import axios from 'axios';
      
      function Register() {
        const [formData, setFormData] = useState({
          username: '',
          email: '',
          password: '',
        });
      
        const handleChange = (e) => {
          setFormData({
            ...formData,
            [e.target.name]: e.target.value,
          });
        };
      
        const handleSubmit = async (e) => {
          e.preventDefault();
          try {
            const response = await axios.post('http://localhost:8000/api/register/', formData);
            console.log('Registration successful:', response.data);
          } catch (error) {
            console.error('Registration error:', error);
          }
        };
      
        return (
          <form onSubmit={handleSubmit}>
            <input
              type="text"
              name="username"
              placeholder="Username"
              value={formData.username}
              onChange={handleChange}
            />
            <input
              type="email"
              name="email"
              placeholder="Email"
              value={formData.email}
              onChange={handleChange}
            />
            <input
              type="password"
              name="password"
              placeholder="Password"
              value={formData.password}
              onChange={handleChange}
            />
            <button type="submit">Register</button>
          </form>
        );
      }
      
      export default Register;
    • src/components/Login.js:

      import React, { useState } from 'react';
      import axios from 'axios';
      
      function Login() {
        const [formData, setFormData] = useState({
          username: '',
          password: '',
        });
      
        const handleChange = (e) => {
          setFormData({
            ...formData,
            [e.target.name]: e.target.value,
          });
        };
      
        const handleSubmit = async (e) => {
          e.preventDefault();
          try {
            const response = await axios.post('http://localhost:8000/api/token/', formData);
            localStorage.setItem('access_token', response.data.access);
            localStorage.setItem('refresh_token', response.data.refresh);
            console.log('Login successful:', response.data);
          } catch (error) {
            console.error('Login error:', error);
          }
        };
      
        return (
          <form onSubmit={handleSubmit}>
            <input
              type="text"
              name="username"
              placeholder="Username"
              value={formData.username}
              onChange={handleChange}
            />
            <input
              type="password"
              name="password"
              placeholder="Password"
              value={formData.password}
              onChange={handleChange}
            />
            <button type="submit">Login</button>
          </form>
        );
      }
      
      export default Login;

Step 3: Run Both Servers

  1. Run the Django Server:

    python manage.py runserver
  2. Run the React Development Server:

    npm start

Testing the Application

  • Open your browser and navigate to http://localhost:3000/register to register a new user.
  • After registration, navigate to http://localhost:3000/login to log in with the same user credentials.
  • Check the console or local storage for the JWT tokens received upon successful login.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment