-
[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