Westagram Clone: 로그인

signet·2021년 2월 2일
0

1. 요구사항

  1. 이메일, 계정, 핸드폰 번호 중 하나로 로그인이 가능하도록 구현
  2. 암호화된 비밀번호를 프론트에서 전달한 비밀번호와 비교
  3. 각각이 잘못되었을 때 오류 반환
  4. 둘 다 올바르게 입력되었을 때 성공메세지 반환

2. views.py

완성된 코드는 다음과 같다

최초 작성했던 코드와 완성코드가 많이 달랐다. 최초에는

  1. 프론트에서 입력받은 값을 직접 사용하였음
  2. User.objects.filter(xxx).exists() 3개를 or로 연결하여 이메일, 계정, 핸드폰 번호 중 하나를 올바르게 입력하였는지 확인함
  3. 회원가입시 암호화를 잘못 적용하여 재수정
  4. try/except로 key error를 처리하였음
    으로 적용하였다. 이 가운데 2번에서 Q object를 이용하여 코드를 간략하게 작성하라는 지적을 받았고, 이를 적용하기 위해 코드를 수정하였다.
  5. 프론트에서 입력받은 값을 변수에 넣었음. 이 때, 이메일, 계정, 핸드폰번호 값은 값이 입력되지 않아도 key error를 바로 반환하지 않도록 data.get()으로 변수를 받았다.
  6. '비밀번호와 id로 사용할 수 있는 3개 값중 1개가 존재하지 않는 경우'를 처리해주기 위해 조건문을 하나 추가로 작성하였다.
  7. '입력 받은 값 중 데이터베이스의 사용자 데이터와 일치하는 것이 있는지'를 판별하는 조건문을 작성하였다.
  8. 3번의 조건을 만족한 상태에서, 일치하는 사용자 계정의 암호화된 비밀번호를 byte타입으로 복호화 한 것과 입력받은 비밀번호를 byte타입으로 암호화 한 것을 비교하여 비밀번호의 일치여부를 확인하는 조건문을 입력하였다.
    상술한 과정을 거쳐 코드를 완성하였다.

3. httpie를 이용한 검증

httpie로 임의의 요청을 전달하는 것을 통해 작동 여부를 검사하였다.

  1. email, account, phone number 중 1개를 입력하여 로그인이 가능한지 시험
http -v POST 127.0.0.1:8000/user/login email='m@.' password='111111111'
http -v POST 127.0.0.1:8000/user/login acconut='m' password='111111111'
http -v POST 127.0.0.1:8000/user/login phonenumber='012' password='111111111'
[03/Feb/2021 11:13:07] "POST /user/login HTTP/1.1" 200 22

{"MESSAGE": "SUCCESS"}

작동하는 것을 확인할 수 있다.

  1. 계정이나 비밀번호를 입력하지 않았을 경우
http -v POST 127.0.0.1:8000/user/login email='m@.'
http -v POST 127.0.0.1:8000/user/login password='111111111'
Bad Request: /user/login
[03/Feb/2021 12:27:58] "POST /user/login HTTP/1.1" 400 24

{"MESSAGE": "KEY_ERROR"}

로직대로 Key error를 반환한다.

  1. 계정이 일치하지 않는 경우
http -v POST 127.0.0.1:8000/user/login email='z@.' password='111111111'
Not Found: /user/login
[03/Feb/2021 12:30:45] "POST /user/login HTTP/1.1" 404 23

{"MESSAGE": "CHECK_ID"}

올바른 계정을 입력하라는 메세지를 반환한다.

  1. 계정은 일치하나 비밀번호가 일치하지 않는 경우
http -v POST 127.0.0.1:8000/user/login email='m@.' password='11111111'
Not Found: /user/login
[03/Feb/2021 12:32:39] "POST /user/login HTTP/1.1" 404 29

{"MESSAGE": "CHECK_PASSWORD"}

비밀번호를 확인하라는 메세지를 반환한다. 이상으로, 모든 경우의 수에 대해 적절한 메세지를 반환하는 것을 확인 할 수 있다.

Q object

쿼리셋에서 데이터를 조건을 부여하여 뽑아내기 위해 작성하는 것으로 사용하기 위해선

from django.db.models import Q

를 해줄 필요가 있다. 이를 이용하면, 쿼리셋을 반환하는 명령어에 조건을 추가할 수 있다. 예를 들어

Classname.objects.filter(Q(classname=condition1) | Q(classname2=condition2))  # or
Classname.objects.filter(Q(classname=condition1) & Q(classname2=condition2))  # and

로 사용할 수 있다. 본래 조건을 걸어주기 위해선 Classname.objects.filter()를 전체 반복하여 조건을 연결해주어야 하는데, Q object를 사용하면 간략화가 가능하다.

0개의 댓글