import json
import bcrypt
import jwt
입력받은 비밀번호를 해쉬 함수로 전환하기 위해 bcrypt.hashpw 진행
입력된 패스워드를 이진화하고 Salting 시행
데이터베이스에는 이진화된 해쉬 비밀번호를 디코딩하여 저장
from django.views import View
from django.http import JsonResponse, HttpResponse
from .models import User
class UserView(View):
def post(self, request):
data = json.loads(request.body)
try:
if User.objects.filter(user_id = data['user_id']).exists() :
return JsonResponse({"message" : "USER_ALREADY_EXIST"}, status = 401)
hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
User(
user_id = data['user_id'],
email = data['email'],
password = hashed_password
).save()
return HttpResponse(status = 200)
except KeyError:
return JsonResponse({'message' : "INVALID_KEYS"}, status = 400)
로그인 시 입력된 패스워드와 데이터베이스 내에 저장된 패스워드를 bcrypt.checkpw를 통해 비교 실시
비교한 두 값이 일치할 경우 payload, secret key, algorithm을 입력하여 JsonResponse로 토큰을 발행
class LoginView(View):
def post(self, request):
data = json.loads(request.body)
try:
if User.objects.filter(user_id = data['user_id']).exists() :
user = User.objects.get(user_id = data['user_id'])
if bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
access_token = jwt.encode({'id' : user.id}, 'secret', algorithm = 'HS256')
return JsonResponse({"access-token" : access_token.decode('utf-8')}, status=200)
return HttpResponse(status=401)
return HttpResponse(status=401)
except KeyError:
return JsonResponse({'message' : "INVALID_KEYS"}, status = 400)