Assignment #1 | Westagram [Mission 6] 로그인 JWT 발급

Jayson Hwang·2022년 5월 21일
0

Westagram Project

목록 보기
6/11
post-thumbnail

::: 현재까지 진행 상황 :::

  • 초기 세팅 완료
  • Users 앱 생성 완료
  • models.py의 User 클래스 작성 완료
  • DB에 migrate까지 진행
  • 회원가입 기능 구현 (정규표현식, 예외처리 사용)
  • 로그인 기능 구현 (계정, 패스워드 필터링 적용)
  • 회원가입 비밀번호 암호화 구현 (bcrypt 적용)

1.. Must Do..

  • 회원가입 과정에서 암호화를 진행했기 때문에,
    로그인 또한 bcrypt를 이용한 로직으로 변경
  • bcrypt의 checkpw method를 이용하여 비밀번호 확인 로직 구성
  • 인가(Authorization) 관련 내 벨로그 글

2.. install pyjwt

유의사항 ::
패키지명은 pyjwt 이지만, import할 때는 jwt

$ pip install pyjwt

3.. views.py

📌 암호화된 SignIn View 코드

import json
import re
import bcrypt
import jwt

from django.http  import JsonResponse
from django.views import View
from django.conf  import settings

from users.models import User

class SignInView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)

            email    = data['email']
            password = data['password']

            user = User.objects.get(email=email)
     (***)  if not bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8')):
                return JsonResponse({"message": "INVALID_PASSWORD"}, status=401)

     (***)  token = jwt.encode({'id': user.id}, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
            return JsonResponse({"message": "SUCCESS", "ACCESS_TOKEN" : token}, status=200)
            
        except KeyError: 
            return JsonResponse({"message": "KEY_ERROR"}, status=400)
            
        except User.DoesNotExist:
            return JsonResponse({"message": "INVALID_USER"}, status=401)

📌 코드 설명

3-1.. 라이브러리 및 환경변수::

import json
import re
import bcrypt
import jwt

from django.http  import JsonResponse
from django.views import View
from django.conf  import settings
  • bcypt & jwt import
  • my_settings.py를 통한 환경변수 관리 방식이 아닌,
    from django.conf import settings를 작성하여 의존성을 줄여준다.
    ex) settings.SECRET_KEY, settings.DATABASES


3-2.. 계정 비밀번호 필터링 암호화

user = User.objects.get(email=email)
if not bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8')):
	return JsonResponse({"message": "INVALID_PASSWORD"}, status=401)
  • checkpw Method 사용

    checkpw(password, hashedPassword)::
    boolean 타입으로 비밀번호와 암호화된 비밀번호를 인자로 받아 같을 경우 ture, 아니면 false.
    password 와 hasedPassword 가 동일한지를 비교함

  • byte 형태로 비교해주기 위해서,
    password.encode('utf-8') & user.password.encode('utf-8')
    인코딩하여 비교

3-3.. JWT 적용

token = jwt.encode({'id': user.id}, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
	return JsonResponse({"message": "SUCCESS", "ACCESS_TOKEN" : token}, status=200)
  • 이메일과 비밀번호가 통과되어 로그인이 성공하였고, 토큰을 발행해주면 됨
  • jwt.encode({'id':}, SECRET_KEY, algorithm)
  • 로그인에 성공하면 token을 발급하고, JsonResponse에 담아서 보낸다.

3-4.. 예외처리

if not User.objects.filter(email=email).exists():
	return JsonResponse({'message':'INVALID_EMAIL'}, stauts=401)

>> 기존에 이메일 필터링을 위해서 작성한 코드를 "DoesNotExist" Error 예외처리로 변경

except User.DoesNotExist:
	return JsonResponse({"message": "INVALID_USER"}, status=401)
profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글