ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] DRF jwt토큰 authentication
    코딩/Django 2022. 1. 22. 23:55

     요새 하는 프로젝트가 백엔드로 파이썬을 필요로 해서 장고를 계속 공부하고 있었는데요, node.js에서는 너무 쉽게 하던 jwt토큰 로그인 구현이 계속 어려웠습니다.

     기나긴 고생 끝에 드디어 이해했네요,

     

    views.py

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .models import User
    from rest_framework.exceptions import AuthenticationFailed
    from api.serializers import UserSerializer
    
    import jwt
    import datetime
    
    # Create your views here.
    
    
    class RegisterView(APIView):
        def post(self, request):
            serializer = UserSerializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            return Response(serializer.data)
    
    
    class LoginView(APIView):
        def post(self, request):
            email = request.data['email']
            password = request.data['password']
    
            user = User.objects.filter(email=email).first()
    
            if user is None:
                raise AuthenticationFailed('User not found!')
    
            if not user.check_password(password):
                raise AuthenticationFailed('Incorrect password!')
    
            payload = {
                'id': user.id,
                'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=60),
                'iat': datetime.datetime.utcnow()
            }
    
            token = jwt.encode(payload, 'secret', algorithm='HS256')
    
            response = Response()
    
            response.set_cookie(key='jwt', value=token, httponly=True)
            response.data = {
                'message': "success",
                'token': token
            }
    
            return response
    
    
    class UserView(APIView):
        def get(self, request):
            token = request.COOKIES.get('jwt')
    
            if not token:
                raise AuthenticationFailed('Unauthenticated')
    
            try:
                payload = jwt.decode(token, 'secret', algorithms=['HS256'])
            except jwt.ExpiredSignatureError:
                raise AuthenticationFailed('Unauthenticated')
    
            user = User.objects.get(id=payload['id'])
            serializer = UserSerializer(user)
    
            return Response(serializer.data)
    
    
    class LogoutView(APIView):
        def post(self, request):
            response = Response()
            response.delete_cookie('jwt')
            response.data = {
                'message': 'success'
            }
            return response

     

    serializers.py

    from rest_framework import serializers
    from .models import User
    
    
    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ['id', 'name', 'email', 'password']
            extra_kwargs = {
                'password': {'write_only': True}
            }
    
        def create(self, validated_data):
            password = validated_data.pop('password', None)
            instance = self.Meta.model(**validated_data)
            if password is not None:
                instance.set_password(password)
            instance.save()
            return instance

     

    models.py

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    # Create your models here.
    
    
    class User(AbstractUser):
        name = models.CharField(max_length=255)
        email = models.CharField(max_length=255, unique=True)
        password = models.CharField(max_length=255)
        username = None
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = []

     

    '코딩 > Django' 카테고리의 다른 글

    [Django] DRF Authentication이 안될 경우  (0) 2022.03.07
    [Django] 2021/12/27 결의  (6) 2021.12.27

    댓글

Designed by Tistory.