Skip to content

Commit 5df3929

Browse files
Merge pull request #144 from jettysaivarun/143-backenddrf-implement-user-login-api-endpoint-with-password-hashing
Implement login API for issue 143
2 parents d58ce34 + f951e64 commit 5df3929

3 files changed

Lines changed: 48 additions & 1 deletion

File tree

backend/apps/authentication/serializers.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from django.contrib.auth import authenticate
12
from django.contrib.auth.models import User
23
from rest_framework import serializers
4+
from rest_framework_simplejwt.tokens import RefreshToken
35

46

57
class RegisterSerializer(serializers.ModelSerializer):
@@ -27,3 +29,20 @@ def create(self, validated_data):
2729
password=validated_data["password"],
2830
)
2931
return user
32+
33+
34+
class LoginSerializer(serializers.Serializer):
35+
username = serializers.CharField()
36+
password = serializers.CharField(write_only=True)
37+
38+
def validate(self, attrs):
39+
username = attrs.get("username")
40+
password = attrs.get("password")
41+
user = authenticate(username=username, password=password)
42+
if user is None:
43+
raise serializers.ValidationError("Invalid username or password")
44+
refresh = RefreshToken.for_user(user)
45+
attrs["user"] = user
46+
attrs["access_token"] = str(refresh.access_token)
47+
attrs["refresh_token"] = str(refresh)
48+
return attrs

backend/apps/authentication/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44

55
urlpatterns = [
66
path("register/", views.RegisterationView.as_view(), name="register"),
7+
path("login/", views.LoginView.as_view(), name="login"),
78
]

backend/apps/authentication/views.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from rest_framework_simplejwt.tokens import RefreshToken
55

66
from .models import UserProfile
7-
from .serializers import RegisterSerializer
7+
from .serializers import LoginSerializer, RegisterSerializer
88

99

1010
class RegisterationView(generics.CreateAPIView):
@@ -35,3 +35,30 @@ def create(self, request, *args, **kwargs):
3535
},
3636
status=status.HTTP_201_CREATED,
3737
)
38+
39+
40+
class LoginView(generics.CreateAPIView):
41+
serializer_class = LoginSerializer
42+
43+
def create(self, request, *args, **kwags):
44+
serializer = self.get_serializer(data=request.data)
45+
serializer.is_valid(raise_exception=True)
46+
user = serializer.validated_data["user"]
47+
profile = UserProfile.objects.get(user=user)
48+
return Response(
49+
{
50+
"success": True,
51+
"data": {
52+
"tokens": {
53+
"access_token": serializer.validated_data["access_token"],
54+
"refresh_token": serializer.validated_data["refresh_token"],
55+
},
56+
"user": {
57+
"id": str(profile.id),
58+
"username": user.username,
59+
"created_at": user.date_joined,
60+
},
61+
},
62+
},
63+
status=status.HTTP_200_OK,
64+
)

0 commit comments

Comments
 (0)