Project: westagram -2 (21.05.31)

Tasic·2021년 5월 31일

wecode project

목록 보기
2/6
post-thumbnail

👍 오늘 한일

  1. Mission2 과제 진행 - 회원가입 엔드포인트 만들기

    • 회원가입 model만들기 (수정완료)
    • 회원가입 view만들기 (완료)
    • 회원가입 시 db에 저장되는 비밀번호 hash화 해서 저장하도록 변경(완료)
  2. Mission3 과제 진행 - 로그인 엔드포인트 만들기 (PR상태)

🔥 변경 사항

User model 변경

기존 nickname과 phone_number를 null 허용하게 했는데, 허용하지 않도록 수정함.

class User(models.Model):
.
.
    nickname     = models.CharField(max_length=40, unique=True)
    phone_number = models.CharField(max_length=13, unique=True)
.
.

기존 get()에서 []로 변경

 nickname     = data['nickname'] 
 phone_number = data['phone_number']

db에 저장되는 비밀번호 hash화 하기

  • 단방향 hash알고리즘을 사용하는 bcrypt를 이용해서 처리하도록 수정
def encrypt_password(password):
    return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
  • 비밀번호 CharField에서 BinaryField로 변경
    DB에 저장된 정보

❗️ Mission3 - 로그인 기능 구현

📝 View

1.users 또는 accounts app 안에 로그인 view를 작성해주세요. [완료 👍]
2.로그인 할 때에는 사용자 계정으로 email과 비밀번호가 필수로 필요합니다. [완료 👍]
3.계정이나 패스워드 키가 전달되지 않았을 시, {"message": "KEY_ERROR"}, status code 400 을 반환합니다. [완료 👍]
4.계정이나 비밀번호가 잘 못 입력시 {"message": "INVALID_USER"}, status code 401을 반환합니다. [완료 👍]
5.로그인이 성공하면 {"message": "SUCCESS"}, status code 200을 반환합니다. [완료 👍]
6.로그인이 성공하면 token을 반환합니다. [완료 👍]

⚙️ 처리로직

            data     = json.loads(request.body)
            email    = data['email']
            password = data['password']
            user     = User.objects.get(email=email)

            if not check_password(password, user.password):
                return JsonResponse({"message": "INVALID_USER"}, status=401)    

            user_token = make_user_token(user.id)

            return JsonResponse({"message": "SUCCESS", "token": user_token}, status=200)
  1. 전송된 Data를 받는다.
  2. User 정보 조회
  3. User 정보가 있으면, 비밀번호가 맞는지 확인
  4. 비밀번호가 맞다면, token을 발행하고 결과에 포함시켜 전송

🚀 전송된 Data를 받는다

  • json형태의 Data를 dictionary형태로 변환해서 받는다.
  • 'email'이나 'password' key 값을 가진 data 가 없으면 KeyError 발생
  • body에 아무 값도 없으면 JSONDecodeError 발생

🔎 User 정보 조회

  • get() 메서드를 이용해서 전송받은 email의 해당되는 user가 있는지 확인
  • 해당 유저가 없으면 DoesNotExist error 발생

🔎 비밀번호가 맞는지 확인

  • 전송받은 비밀번호와 db에 있는 hash정보를 비교하여 같은지 확인
def check_password(password, hashed_password):
    return bcrypt.checkpw(password.encode('utf-8'), hashed_password)

👏 비밀번호가 맞다면, token을 발행하고 결과에 포함시켜 전송

  • jwt를 이용하여 token을 생성한다.
  • 이때 필요한 SECRET_KEY, HASH_ALGORITHM 정보는 유출이 되면 안된다(Git에 commit이 되면 안된다)
  • DB 정보 처럼 Local에만 존재하는 setting파일에 저장하고 프로젝트 setting.py에서 불러서 사용할 수 있도록 구성한다.
from ######.settings      import SECRET_KEY, HASH_ALGORITHM

def make_user_token(id):
    return jwt.encode({'user_id': id}, SECRET_KEY, algorithm=HASH_ALGORITHM)

settings.py

from my_settings import SECRET_KEY, DATABASES, HASH_ALGORITHM
.
.
.
HASH_ALGORITHM = HASH_ALGORITHM
profile
블로그 옮겼습니다 (https://jotasic.github.io)

0개의 댓글