urlpatterns = [
path('/signup', SignUpView.as_view()),
path('/signin', SignInView.as_view())
]
url은 당연히 회원가입과 로그인이 달라야 하기 때문에 /signin
으로 설정했습니다.
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안의 암호화된 비밀번호가 달라서 encode
된 Bytes
타입으로 일치시킨 뒤
checkpw
메서드를 통해 비교하도록 설정했습니다.
로그인이 성공하면 인가를 위한 본인 확인 수단인 토큰이 발급됩니다.
payload
에는 이메일을 담아야할지, 아이디를 담아야 할 지 고민했는데
사용의 편의를 위하여 아이디로 설정했습니다.
토큰 발급에 대한 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
변수에 담아서 어떤 테스트 함수에서든 사용할 수 있게 했습니다.
초기 세팅에서 전역변수로 설정하지 않았다면, 지금은 로그인 성공 하나지만
나중에는 토큰이 필요한 테스트 함수마다 다 만들어야하는데
그런 불편함을 없애고자 설정하게 되었습니다.
내일은 권한에 따른 상품추가입니다.