티스토리 뷰

Magazine B은 여느 웹사이트와 동일하게 아이디와 비밀번호로 로그인을 하며,

회원가입 조건은 아이디와 비밀번호, 이름 이메일이 필수 입력 조건이지만 아이디와 비밀번호 이메일에는 특정 문자 입력 조건이 있으며 이메일 휴대전화는 조건이 따로 없었다.

 

Magazine K 회원가입 조건

→ 회원 아이디이메일비밀번호는 파이썬 정규표현식을 만족해야 하며, 아닐 시 400 에러 반환한다.

→ 입력한 회원 아이디가 이미 중복된 아이디일 경우, 400 에러 반환한다.

→ 프론트에서 보내주는 key값에 대한 오류 발생 시 key error 400 반환한다.

→ 회원가입 성공 시 201 반환한다.

 

views.py

HTTP 통신으로 받은 method 종류에 따라 수행하는 방법을 정의해야 하는데, 회원가입은 클라이언트가 정보를 body에 담아 보내기 때문에 post method로 JoinView클래스의 함수를 정의했다.

 

# users.views.py
def post(self, request):
   try: 
       data = json.loads(request.body)

       username      = data['username']
       password      = data['password']
       name          = data['name']
       phone_number  = data['phone_number']
       email         = data['email']

       validate_username(username)  # 정규 표현식 검증 함수 사용 
       validate_email(email)
       validate_password(password)

       if User.objects.filter(username = username).exists():
            return JsonResponse({'MESSAGE':'Already_Registered_User'}, status=400) 
	# 정규 표현식 검증 후 아이디 중복 검증 후 입력받은 비밀번호를 해쉬화 하여 변수에 저장한다.
       hash_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

→ 유저가 입력한 아이디(username)과 비밀번호(password) 이메일(email)은 프론트에서도 정규 표현식 검증을 했지만 백앤드에서도 따로 표현식 검증 함수를 만들어 사용했다.

# core.validatior.py 

def validate_username(username):
    REGEX_USER_NAME = '^[a-zA-Z0-9]{4,16}$'
    if not re.match(REGEX_USER_NAME, username):
        raise ValidationError('Invalid Id format')

 

 

 

Magazine K 로그인 조건

→ 입력한 비밀번호가 다를 경우, 401 에러 반환한다.

→ 프론트에서 보내주는 key값에 대한 오류 발생 시 key error 400 반환한다.

→ 로그인 성공 시 assess_token과 함께  200 반환한다 .

 

views.py

마찬가지로 로그인 또한 클라이언트가 아이디와 비밀번호 정보를 body에 담아 보내기 때문에 post method로 LoginView클래스의 함수를 정의했다.

 

유저가 입력한 비밀번호와 해쉬화하여 데이터베이스에 저장한 패스워드가 일치한지 확인하고, 일치할 경우 유저의 id값 (Pk)을 token에 넣어 발급하여 응답부분에 토큰을 넣어 클라이언트에게 응답한다.

# users.views.py
def post(self, request):
	try:
       data = json.loads(request.body)

       username = data['username']
       password = data['password']

       user = User.objects.get(username = username)

       if not bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8')):
       	    return JsonResponse({'MESSAGE':'INVALID_USER'}, status=401)
        
       access_token = jwt.encode({'id': user.id}, settings.SECRET_KEY, settings.ALGORITHM)

       return JsonResponse({'MESSAGE':'SUCCESS', 'AUTHORIZATION':access_token}, status=200)

 

 

Magazine K 로그인 및 회원가입 

 

'Projects > Magazine K' 카테고리의 다른 글

Magazine K - 리뷰 작성 기능 구현  (0) 2022.08.11
Magazine K - 상세페이지 구현  (0) 2022.08.03
Magazine K 프로젝트 회고  (0) 2022.08.01
댓글