DEV Community

Cover image for User Authentication in DjangoRestFramework using SimpleJWT [Login, Signup]
Shivam Rohilla
Shivam Rohilla

Posted on • Edited on

4 2

User Authentication in DjangoRestFramework using SimpleJWT [Login, Signup]

Hello Devs, In this blog you will learn how to create User Authentication, login and signup API's in djangorestframework using SimpleJWT.

Source Code:- https://github.com/ShivamRohilllaa/DjangoRestFramework-UserAuthentication/

Post Link:- https://pythondjangogeek.com/django/streamlined-user-authentication-with-django-and-si/

Enter fullscreen mode Exit fullscreen mode

I hope you guys knows how to create a django project so I am skipping those steps and let's jump on code directly.

Create virtual enviornment,

python3 -m venv envname
Enter fullscreen mode Exit fullscreen mode

Install these packages:-

django
djangorestframework
djangorestframework-simplejwt

Enter fullscreen mode Exit fullscreen mode

Add restframework in your installed apps in settings.py file:

INSTALLED_APPS = [
    'rest_framework',
]

Enter fullscreen mode Exit fullscreen mode

and add these settings for rest_framework and simpleJWT.

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}    

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=15),
    'AUTH_HEADER_TYPES': ('Bearer',),
    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
}

Enter fullscreen mode Exit fullscreen mode

Create Model for a student

class Student(models.Model):
    auth = models.OneToOneField(User, on_delete=models.CASCADE, related_name='student_profile')
    name = models.CharField(max_length=100)
    email = models.EmailField(max_length=100)

    def __str__(self):
        return self.name
Enter fullscreen mode Exit fullscreen mode

and now we will create user signup and user profile serializers for signup and login

from rest_framework import serializers
from userapp.models import Student
from django.contrib.auth.models import User

class UserSignupSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'password')

    extra_kwargs = {
        'first_name': {'required': True, 'allow_blank': False},
        'last_name': {'required': True, 'allow_blank': False},
        'email': {'required': True, 'allow_blank': False},
        'password': {'required': True, 'allow_blank': False},        
    }    


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'email', 'username')

Enter fullscreen mode Exit fullscreen mode

now write views for utilise the serializers

from django.shortcuts import render
from .models import Student
from .serializers import UserSignupSerializer, UserSerializer
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import User

@api_view(['POST'])
def signup(request):
    data = request.data
    serializer = UserSignupSerializer(data=data)
    if serializer.is_valid():
        if not User.objects.filter(username=data['email']).exists():
            user = User.objects.create(first_name=data['first_name'], last_name=data['last_name'], username=data['email'], email=data['email'], password=make_password(data['password']))
            user.save()
            student = Student.objects.create(auth=user, name=data['first_name'], email=data['email'])
            return Response({'message':'User Created Successfully'}, status=status.HTTP_201_CREATED)
        else:
            return Response({'message':'User Already Exists'}, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@api_view(['GET'])
def login(request):
    data = request.data
    if User.objects.filter(username=data['email']).exists():
        user = User.objects.get(username=data['email'])
        if user.check_password(data['password']):
            return Response(UserSerializer(instance=user).data, status=status.HTTP_200_OK)
        else:
            return Response({'message':'Invalid Password'}, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response({'message':'User Does Not Exist'}, status=status.HTTP_400_BAD_REQUEST)

Enter fullscreen mode Exit fullscreen mode

Now map these views in urls.py

urlpatterns = [
    path('signup/', views.signup, name='signup'),
    path('login/', views.login, name='login'),
Enter fullscreen mode Exit fullscreen mode

and for testing these endpoints use postman and pass these responses

for singup api

{
"first_name": "demo",
"last_name": "demo",
"email": "demo@gmail.com",
"password": "demo"
}
Enter fullscreen mode Exit fullscreen mode

for login

{
"email": "demo@gmail.com",
"password": "demo"
}

Enter fullscreen mode Exit fullscreen mode

Source Code

Source Code:- https://github.com/ShivamRohilllaa/DjangoRestFramework-UserAuthentication/
Enter fullscreen mode Exit fullscreen mode

Thank You
Shivam Rohilla | Python Developer

DM me your queries:-
https://www.linkedin.com/in/shivamrohillaa/ 
Enter fullscreen mode Exit fullscreen mode

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay