[Django] 로그인 기능 구현하기💡

Inah-_-·2021년 3월 15일
0

Django

목록 보기
4/8
post-thumbnail

지난글 > 회원가입 구현

🚀 Westagram 로그인 기능 구현

구현 조건

  • 로그인 시 사용자 계정(email)과 패스워드를 필수로 한다.
  • 이메일 혹은 패스워드 키가 전달되지 않았을 시 KEY_ERROR를 반환한다.
  • 계정이 존재하지 않거나 비밀번호가 맞지 않을 때 INVALID_USER를 반환한다.
  • 로그인 성공 시 SUCCESS를 반환한다.

1. Views.py 작성해주기 🗒

전에 블로깅한 views.py에 이어서 작업 (같은 user app)

class SignInView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            
            user = User.objects.get(email = data['email'])
            
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status=400)
        except User.DoesNotExist:
            return JsonResponse({'message' : 'INVALID_USER'}, status=401)

Json body에 data 가져와주고~
get method로 로그인 시도하는 user의 정보를 DB에 저장 된 email과 대조해줌
user의 정보가 없거나, key를 잘못 입력했을 때의 ERROR를 예외처리로 핸들링


if not bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
    return JsonResponse({'message' : 'INVALID_USER'}, status=400)

token = jwt.encode({ 'password' : data['password'] }, SECRET_KEY, algorithm='HS256')
    return JsonResponse({'message' : 'WOW!!!!SUCCESS!!!!', 'access_token' : token.decode('utf-8')}, status=200)

@decorator 사용 전 구현했던 access_token
인코딩 된 패스워드와 저장된 패스워드가 동일하지 않으면 INVALID_USER 반환,

token에 유저 정보와 시크릿키, 적용할 알고리즘 발행 후 SUCCESS 반환~~~!~!


어려운 당신 decorator..🎁

이번에 사용할 decorator 친구는 user 토큰에 관련 된 아이기 때문에 user app에 utils.py 생성!

import jwt, json

from django.http    import JsonResponse
from my_settings    import SECRET_KEY, ALGORITHM
from user.models    import User

def TokenCheck(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            access_token = request.headers.get('Authoriation')
            payload      = jwt.decode(access_token, SECRET_KEY, algorithms=ALGORITHM)
            user         = User.objects.get(id = payload['id'])
            request.user = user
        
        except User.DoesNotExist:
            return JsonResponse({'message':'INVALID_USER'}, status=400)
        
        return func(self, request, *args, **kwargs)

    return wrapper

user의 로그인 권한이 포함 된 페이지
(마이페이지, 장바구니) 등등에 붙여 줄 decorator! 어떤 식의 인자를 받을지 알 수 없으므로
가변인자와 키워드 가변인자를 포함해준다.
Token Check에 필요한 아이들
jwt, SECRET_KEY, ALGORITHM, User import 해줌 나머지는 위 코드와 동일


app urls.py

from django.urls import path
from .views      import SignUpView, SignInView

urlpatterns = [
    path('/signup', SignUpView.as_view()),
    path('/signin', SignInView.as_view())
]

project urls.py

from django.urls import path, include

urlpatterns = [
    path('user', include('user.urls')),
]

User app의 Signup, SignIn🧬


싸랑행 내 코드

profile
Backend Developer

0개의 댓글