1. 혼자 만들어보는 Zara - 로그인

Kiyong Lee·2021년 12월 6일
0

개인프로젝트

목록 보기
3/9

혼자 만들어보는 Zara - 로그인


1. urls.py

urlpatterns = [
    path('/signup', SignUpView.as_view()),
    path('/signin', SignInView.as_view())
]

url은 당연히 회원가입과 로그인이 달라야 하기 때문에 /signin으로 설정했습니다.


2. views.py

class SignInView(View) :
    def post(self, request) :
        try :
            data = json.loads(request.body)
            
            email    = data['email']
            password = data['password']
            
            user = User.objects.get(email=email)
            
            if not bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8')) :
                return JsonResponse({'message' : 'INVALID_PASSWORD'}, status=401)
            
            access_token = jwt.encode({'id' : user.id}, settings.SECRET_KEY, settings.ALGORITHMS)
            
            return JsonResponse({'access_token' : access_token}, status=201)
        
        except KeyError :
            return JsonResponse({'message' : 'KEY_ERROR'}, status=400)
        
        except User.DoesNotExist :
            return JsonResponse({'message' : 'USER_DOES_NOT_EXIST'}, status=400)

우선, 받은 이메일로 데이터베이스에서 해당 유저의 정보를 가져옵니다.

다만, 로그인 시 이메일을 잘못 입력하는 경우가 있으며 없는 이메일로 로그인 시

User.DoesNotExist가 발생하는데, 이에 대해 예외처리를 해주었습니다.

또한, 이메일을 올바르게 입력했어도 비밀번호가 다른 경우가 있어 입력한 비밀번호와

DB상의 비밀번호를 체크해야 했습니다.

bcrpyt 단방향 암호 해시 함수이기 때문에, 내가 입력한 일반비밀번호와
DB안의 암호화된 비밀번호가 달라서 encodeBytes타입으로 일치시킨 뒤
checkpw 메서드를 통해 비교하도록 설정했습니다.

로그인이 성공하면 인가를 위한 본인 확인 수단인 토큰이 발급됩니다.

payload에는 이메일을 담아야할지, 아이디를 담아야 할 지 고민했는데

사용의 편의를 위하여 아이디로 설정했습니다.


3. Unit Test

토큰 발급에 대한 Unit Test때문에 작성하게 되었습니다.

로그인 시, 토큰이 발급된다고 했는데 Unit Test에서도 토큰을 생성해줘야 합니다.

def setUp(self) :
        general_role = Role.objects.create(id=2, role='user')
        user1        = User.objects.create(id=1, email='user@test.com', password=bcrypt.hashpw('1234'.encode('utf-8'), bcrypt.gensalt()).decode('utf-8'), role=general_role)
        
        global access_token
        access_token = jwt.encode({'id':user1.id}, settings.SECRET_KEY, settings.ALGORITHMS)

...

 def test_success_sign_in(self) :
        client = Client()

        user_info = {
            "email"    : "user@test.com",
            "password" : "1234"
        }

        response = client.post('/users/signin', json.dumps(user_info), content_type='application/json')

        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.json(), {'access_token' : access_token})

setUp 메서드에서 테스트를 위한 초기값 설정을 하는데, 유저 생성 후
토큰을 global변수에 담아서 어떤 테스트 함수에서든 사용할 수 있게 했습니다.

초기 세팅에서 전역변수로 설정하지 않았다면, 지금은 로그인 성공 하나지만
나중에는 토큰이 필요한 테스트 함수마다 다 만들어야하는데

그런 불편함을 없애고자 설정하게 되었습니다.


내일은 권한에 따른 상품추가입니다.

profile
ISTJ인 K-개발자

0개의 댓글

관련 채용 정보