사용자에게 입력받는 Password (ex."12345678") 이라고 가정하면, Hashing Algorithm에 입력하기 위해 먼저 Byte형으로 변환해주어야 한다.
이 과정을 Encoding이라 한다.
password = '1234' encoded_password = bcrypt.encode('utf-8') # utf-8 문자 인코딩 방식으로 encode함.
hashed_password = bcrypt.hashpw(encoded_password, bcrypt.gensalt())
saved_password = hashed_password.decode('utf-8')
if bcrypt.checkpw(hashed_password, saved_password.encode()): user_id = {'user-id', 1200} # 실제는 DB에 있는 user의 id를 가지고 온다. token = jwt.encode(user_id, 'secret_key', algorithm='HS256')
사용자가 로그인 한 후 다른 웹페이지를 옮겨다닐 때, 다시 로그인 할 필요 없게끔 Ticket을 발행하는 것이 Access Token이라고 한다.
먼저, 사용자가 입력한 PW와 DB에 저장되어 있는 PW를 비교한다.
그러나, 여기서 주의할 점은 토큰을 발행할 때는 DB에 String형으로 저장된 Token을 다시 Byte형으로 변환해서 비교해야 한다.
비교하여 True이면 해당 User를 구분할 수 있는 식별자(대표적으로 id값)과 SECRET_KEY 값, Hashing Algorithm(jwt에서는 HS256이란 알고리즘을 제공한다)을 Argument로 넘겨서 jwt.encode 함수에 넘기면 token을 발행한다.
user_data = User(
phoneNumber = data['phoneNumber'],
name = data['name'],
email = data['email'],
password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8'),
).save()
savedData = User.objects.get(email=payload['email'])
if not (savedData and bcrypt.checkpw(payload['password'].encode(), savedData.password.encode())):
return JsonResponse({'message' : 'INVALID_USER'}, status=401)
login_token = jwt.encode({'user_id' : savedData.id} , 'secret_key', algorithm = 'HS256').decode() ## string형태의 hashed_pw가 token화 되어서 byte화 되어 나옴.
return JsonResponse({'access_token':login_token}, status=200)