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를 만든다.