Django REST framework with JWT Authentication(part-3)

 

So, this is the final round of this tutorial.....😁😁😁😁😁


Let create a JWT Authentication:

  • helper file to create a token and authentication using cookies.
  • create a helper.py file inside a accounts app.
so our file looks like this:


from django.contrib.auth import get_user_model
import jwt
import datetime
from django.conf import settings
from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions

User = get_user_model()



def generate_access_token(user, *args, **kwargs):

payload = {
"user_id": user.id,
"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=60),
"iat": datetime.datetime.utcnow(),
}
return jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256').decode("utf-8")


class JWTauthentication(BaseAuthentication):
def authenticate(self, request):
token = request.COOKIES.get("jwt")

if not token:
return None

try:
payload = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
except jwt.ExpiredSignatureError:
raise exceptions.AuthenticationFailed("Unauthenticated")

user = User.objects.filter(id=payload["user_id"]).first()

if user is None:
raise exceptions.AuthenticationFailed("User Not Found")
return (user, None)

Let's march to views.py file to create login and logout api view.

@api_view(["POST"])
def login_view(request, *args, **kwargs):
if request.user.is_authenticated:
return Response({'Message': 'You are already logged in ...'}, status=400)
username = request.data.get("username")
password = request.data.get("password")

user = (
User.objects.filter(Q(username__iexact=username)
| Q(email__iexact=username))
.distinct()
.first()
)

if user is None:
raise exceptions.AuthenticationFailed("user not found")

if not user.check_password(password):
raise exceptions.AuthenticationFailed("Incorrect password")

response = Response()
token = generate_access_token(user)
response.set_cookie(key="jwt", value=token, httponly=True)
response.data = {"jwt": token}
return response


@api_view(["POST"])
def logout_view(request):
response = Response()
response.delete_cookie(key="jwt")
response.data = {"message": "success"}
return response


Our Login and logout views are done. Now we are registering login and logout views on urls.py file.

from django.urls import path
from .views import register_view, login_view, logout_view

urlpatterns = [
path('register', register_view, name="register"),
path('login', login_view, name="login"),
path('logout', logout_view, name="logout")

]

Now our test begins with postman:

Our Registerseems like this:



An our Login with token💪💪💪💪💪
[Note: our login will support both username and email]


Finally It is over.. 💥💥💥.

Hope you guys enjoyed it.... bye bye till next tuts ✋✋

 

Post a Comment

Previous Post Next Post