Mission5-6에서는 인증&인가 작업을 진행합니다.
1.유저가 아이디와 비번을 생성하면 비번을 암호화해서 DB에 저장하고
2.이후에 유저가 로그인을 하기 위해 아이디와 비밀번호를 입력하면
3.유저가 입력한 비밀번호를 암호화 한 후 암호화되서 DB에 저장된 유저의 비밀번호와 비교한 후
4.일치하면 access token
을 클라이언트에게 전송하는 절차를 진행해 보겠습니다.
먼저 유저가 아이디와 비번을 생성하면 비번을 암호화해서 DB에 저장하게 하기 위해 SignUpView 클래스에 bcrypt를 사용하여 암호화를 진행했습니다.
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
그리고 이를 DB에 저장하기 위해 Mission2에서 password=data['password']였던 부분을 password=hashed_password로 변경하였습니다.
User.objects.create(
name = data['name'],
email = data['email'],
password = hashed_password,
phone = data['phone'],
nickname = data.get('nickname', '')
이후에는 SignInView 클래스에서 유저가 입력한 비밀번호를 암호화 한후 암호화되서 DB에 저장된 유저의 비밀번호와 비교합니다.
bcrypt.checkpw를 통해 비교하여 일치하지 않으면 INVALID_USER메세지가 나오도록 작성하였고 성공하면 aceess token
이 보내지도록 작성하였습니다.
if not bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')) :
return JsonResponse({"message":"INVLIAD_USER"}, status=401)
return JsonResponse({"message":"SUCCESS", "access_token" : access_token}, status=200)
access token
의 경우 my_settings에 SECRET_KEY와 ALGORITHM을 작성하여 직접 드러나지 않도록 하였습니다. ALGORITHM은 HS256을 사용하였습니다.
access_token = jwt.encode({"id" : user.id}, SECRET_KEY, algorithm=ALGORITHM)
전체적인 코드는 다음과 같습니다.