import json
import bcrypt
import jwt
from django.views import View
from django.http import HttpResponse, JsonResponse
from .models import Account
from westagram_project.settings import SECRET_KEY
class SignUpView(View):
def post(self, request):
signup_data = json.loads(request.body)
try:
if Account.objects.filter(email=signup_data['email']).exists():
return HttpResponse(status=400)
# encryption below
# 입력된 password 는 문자열형태 이므로 hashpw 화를 위해 bytes 형태로 encoding.
password = signup_data['password'].encode('utf-8')
# 파이썬 쉘에서 연습해본 대로 hashpw 화 시킨다. (인코딩된 password + 소금치기)
password_encrypt = bcrypt.hashpw(password, bcrypt.gensalt())
# DB 에 (models.py 에서 정의한 password 의 필드셋을 확인해볼것) 저장할 수 있는 유니코드 문자열 형태로 디코딩
password_encrypt = password_encrypt.decode('utf-8')
# 암호화된 password_encrypt 를 변수 password 로 DB 에 저장.
Account(
email = signup_data['email'],
password = password_encrypt
).save()
return HttpResponse(status=200)
except KeyError:
return JsonResponse({"message":"INVALID_KEYS"}, status=400)
로그인을 할 때 사용자가 입력한 비밀번호가, DB 에 있는 사용자의 이메일과 매칭되는 비밀번호와 일치하는지 확인해야 한다. 일치한다면 토큰을 발행해서 HTTP 응답에 같이 넘겨주면 된다.
비밀번호가 일치하는지 확인한다는 말은, 비밀번호 그 자체를 비교한다는 뜻이 아니고 회원가입시 저장해 놓은 암호화된 비밀번호 와 사용자가 로그인을 위해 이번에 입력한 비밀번호를 bcrypt.check
메서드로 비교해서 True or False 의 결과값을 주는 것이라고 한다.
비밀번호 확인 후 토큰이 생성되면 Json Response 로 토큰을 응답할 수 있도록 유니코드 문자열로 디코딩해 값을 전달해 준다.
class SignInView(View):
def post(self, request):
signin_data = json.loads(request.body)
try:
if Account.objects.filter(email=signin_data['email']).exists():
user = Account.objects.get(email=signin_data['email'])
## check password from database
# 사용자가 입력한 비밀번호 인코딩, 사용자이메일과 매칭되는 DB 의 비밀번호 인코딩.
# 이 두 값을 bcrypt.checkpw 로 비교한다.
if bcrypt.checkpw(signin_data['password'].encode('utf-8'), user.password.encode('utf-8')):
# 토큰발행, 유니코드 문자열로 디코딩, 토큰을 담아 응답
token = jwt.encode({'email':signin_data['email']}, SECRET_KEY, algorithm = "HS256")
token = token.decode('utf-8')
return JsonResponse({"token":token}, status=200)
else:
return HttpResponse(status=401)
return HttpResponse(status=400)
except KeyError:
return JsonResponse({"message":"INVALID_KEYS"}, status=400)