encoding : 'str' -> 'byte'
decoding : 'byte' -> 'str'
pip install bcrypt
기본 문법 : bcrypt.hashpw(password, salt)
salt 생성 : bcrypt.gensalt([num])
비밀번호 확인 : bcrypt.checkpw(password, hashed_pw)
class SignupView(View):
def post(self, request):
try :
signup_data = json.loads(request.body)
email = signup_data["email"]
password = signup_data["password"]
hashed_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
Accounts.objects.create(
name = signup_data["name"],
email = email,
password = hashed_pw.decode('utf-8'),
phone_number = signup_data["phone_number"],
)
return JsonResponse({"MESSAGE": "SUCCESS"}, status=201)
except KeyError :
return JsonResponse({"MESSAGE": "KEY_ERROR"}, status=400)
request.body에 담겨온 데이터를 json.loads로 ditc type으로 캐스팅해서 signup_data에 담는다.
이 중 key 가 "password"인 value를 'password'라는 변수에 담고, bycrypt의 메서드를 활용해서 암호화하는 과정이다.
초기에 입력받은 password 는 str 타입이므로 encoding을 통해 byte 타입으로 바꿔서 활용한다.
이렇게 암호화된 비밀번호를 DB에 저장할 때는 다시 str 타입으로 바꿔줘야 한다(decoding)
bcrypt.checkpw(password, hashed_pw)
class LoginView(View):
def post(self, request):
try :
login_data = json.loads(request.body)
email = login_data["email"]
password = login_data["password"]
account = Accounts.objects.get(email=email)
if not bcrypt.checkpw(password.encode('utf-8'), account.password.encode('utf-8')) :
raise ValidationError("INCORRECT_PASSWORD")
token = jwt.encode( {'account_id': account.id}, settings.SECRET_KEY, settings.ALGORITHM)
return JsonResponse({"TOKEN": token}, status=201)
except KeyError :
return JsonResponse({"MESSAGE": "KEY_ERROR"}, status=400)
except ValidationError as verr :
return JsonResponse({"MESSAGE": verr.message}, status=401)
중간에 jwt 라는 녀석이 나오는데 토큰발급에 관한 라이브러리 이므로 별도 포스팅으로 다루도록 하자.