[Django] Westagram(2) - 로그인 기능 구현

그냥·2022년 6월 19일
0

django

목록 보기
10/20
class LogIn(View):
    def post(self, request):
        
        try :
            data = json.loads(request.body)
            user_email         = data['email']
            user_password      = data['password']

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

            user = User.objects.get(email = user_email)

            encoded_user_password = user_password.encode('utf-8')
            encoded_db_password = user.password.encode('utf-8')

            if not bcrypt.checkpw( encoded_user_password, encoded_db_password ):
                return JsonResponse({'MESSAGE' : 'INVALID_PASSWORD'}, status = 401)

            token = jwt.encode({'user_id' : user.id}, SECRET_KEY, ALGORITHM)
            return JsonResponse({'token' : token}, status = 200)
                
        except KeyError :
            return JsonResponse({'MESSAGE' : 'KEY_ERROR'}, status = 400)


1. 요청 데이터 형식

data = json.loads(request.body)
            user_email         = data['email']
            user_password      = data['password']
  • 로그인을 위해서 입력해야 할 두 정보 email, password를 받는 코드를 만든다.


2. 로그인

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

user = User.objects.get(email = user_email)
encoded_user_password = user_password.encode('utf-8')
encoded_db_password = user.password.encode('utf-8')

if not bcrypt.checkpw( encoded_user_password, encoded_db_password ):
       return JsonResponse({'MESSAGE' : 'INVALID_PASSWORD'}, status = 401)

token = jwt.encode({'user_id' : user.id}, SECRET_KEY, ALGORITHM)
return JsonResponse({'token' : token}, status = 200)

1) 이메일 확인

if not User.objects.filter(email = user_email).exists():
       return JsonResponse({'MESSAGE' : 'INVALID_EMAIL'}, status = 401)
  • DB 내에 입력한 이메일과 일치한 것이 있는지 확인하고, 없으면 에러를 반환한다.

2) 비밀번호 확인

user = User.objects.get(email = user_email)
encoded_user_password = user_password.encode('utf-8')
encoded_db_password = user.password.encode('utf-8')

if not bcrypt.checkpw( encoded_user_password, encoded_db_password ):
       return JsonResponse({'MESSAGE' : 'INVALID_PASSWORD'}, status = 401)
  • encoded_user_password = user_password.encode('utf-8'):
    요청 시 받은 user_password = data['password'] 를 인코딩 한다.
  • encoded_db_password = user.password.encode('utf-8'):
    DB에 저장되어 있는 password를 인코딩한다.
  • if not bcrypt.checkpw( encoded_user_password, encoded_db_password ):
    return JsonResponse({'MESSAGE' : 'INVALID_PASSWORD'}, status = 401)
    bcrpyt.checkpw를 통해서 비밀번호 확인을 한다. 비밀번호가 맞지 않다면 에러를 반환한다.

3) 토큰 발급

token = jwt.encode({'user_id' : user.id}, SECRET_KEY, ALGORITHM)
return JsonResponse({'token' : token}, status = 200)
  • 비밀번호가 확인되면 jwt.encode를 통해서 토큰을 발급 한다.
  • token = jwt.encode({'user_id' : user.id}, SECRET_KEY, ALGORITHM)
    payload로 user_id를 받고, SECRET_KEY,와 ALGORITHM은 중요한 정보이기 때문에 .gitignore에 추가된 파일에 작성 후 import 해온다.
  • return JsonResponse({'token' : token}, status = 200)
    client에서 발급된 토큰을 확인 할 수 있도록 위와 같이 Response를 만든다.

0개의 댓글

관련 채용 정보