TIL - 43 Westagram3

이동근·2021년 2월 4일
0

django

목록 보기
8/12

Mission3 - 로그인 구현하기

조건

  • 인스타그램에 회원가입을 할 때에는 사용자 계정(전화번호, 사용자 이름 또는 이메일 중 하나)를 필수로 필요합니다.
  • 인스타그램에 로그인 할 때에는 비밀번호가 필수로 필요합니다.
  • 계정이나 패스워드 키가 전달되지 않았을시, keyError를 메세지로 보내고 status code로 400을 리턴
  • 계정이 존재하지 않을 때나 비밀번호가 맞지 않을때 message INVAlID_USER status code 400을 반환 합니다.

코드

기본적으로 로그인 역시 프론트에서 보낸 데이터를 가지고 db에 저장되어 있는 내용과 비교해 보고 맞으면 성공을 하고 토큰을 보내준다. 그리고 다를시에 오류코드는 리턴한다. 이러한 flow를 가지고 생각하면 될 것 같다.

  • MISSION2에서 구현한 회원가입과는 기능이 다르기 때문에 새로운 클래스를 만든다.
  • json으로 받은 데이터를 받아서 분류하고 db에 있는 데이터와 비교하는 과정을 실시한다.
  • password를 비교해서 맞으면 토큰과 성공했다는 message를 리턴한다.
  1. 회원 가입과 같은 큰 틀은 가진다 기능구현이 다르기 때문에 새로운 클래스로 만들어 준다.

-> POST, GET과 같은 http response와 관련되어 있는 내용은 한 클래스다 한 개만 구현하는 것이 좋다. 그래서 POST 기능이 여러개 필요한 경우 에는 다른 class로 만들어줘야 한다.!!View에서 class를 나누는 기준은 구현해야 하는 기능으로

  1. 이름의 존재여부 확인!!
  • django-shell에서 했던 대로 filter를 걸어서 존재여부를 확인한다. 여기서 True가 나오게 되면 그 이름을 가지고 db에서 password를 추출해야 하기때문에 user라는 변수를 만들어 준다.
  • user는 Userinfo에 있는 사람을 get으로 가져온다.(여기서 filter가 아니고 get으로 가져오는 이유는 받아지는 값에 대한 형태가 다르기 때문이다. get으로 받으면 단순히 객체로 받을 수 있지만, filter는 qureyset으로 받아지기 때문에 get으로 받는것이 더욱 수월하고 불필요한 코드를 쓸 필요가 없다.)
  1. 비밀번호 확인
  • 회원 가입시에 bcrypt를 사용해서 db string 형식으로 저장을 해주었다. bcrypt.checkpw를 통해 data['password'] = 입력받은 비밀번호, user.password = name이 db에 존재한다고 확인하고 선언을 해준 'user'를 가지고 db에 저장되어있는 password와 일치하는지 맞춰본다.
  • 비교를 위해서는 저장해준 암호는 str 타입으로 저장해 놓은 암호를 바이트 타입으로 바꿔줄 필요가 있다. 그래서 user.password.encode()를 사용해서 바이트 타입으로 바꿔 준다. 그리고 입력 받은 암호를 data['password'].encode()를 통해 암호화된 바이트 타입으로 바꿔주고, 비교를 한다.
  • 비교를 했을때 'True'면 access_toke을 아니면 INAVLID_PASSWORD로 메세지를 보낸다. 토큰을 보내는 것까지 이상이 없으면 최종 성공했다는 메세지를 보낸다.
  1. 최종 코드

error 모음집

  • 프론트와의 연결 전 빽엔드 끼리 연결 될 당시에, 회원가입은 제대로 이루어 졌지만, 로그인에서 오류가 일어났다. 확인 해보니 json으로 받은 데이터를 각 칼럼에 넣어주고 나서 그 이후 'if userinfo.objects.filter(name=name)' 이 부분에서 넘어가지 않았다.

  • print() 문을 사용해서 오류가 일어난 부분에 대해서 찾아보았다.
    500 error는 완전히 내 잘못이기 때문에 꼼꼼히 살펴 보았다....
    해결 -> data.get을 하는 부분에 ',' 가 찍혀있었다....
  • 1번을 해결 후에 다시 시도해 보았지만 이번에도 500 오류가 일어났다. 하지만 access_token 부분에서 오류가 일어났다. jwt.encode() 부분에서 오류가 났고 정의되지 않았다는 내용의 오류메세지가 발생 되었다. pip freeze를 통해 jwt의 설치 여부와, import의 유무 역시 확인을 했지만 모두 이상이없었다.

    -> 원인을 찾아보니 jwt는 설치되어 있지만 파이썬전용 jwt pyjwt는 설치가 되어 있지 않았다. 이후 설치 해보니, 정상적으로 성공할 수 있었다.

profile
하루하루 1cm 자라는 개발자

2개의 댓글

comment-user-thumbnail
2021년 2월 11일

아주 친절한 설명 굿입니다^^

1개의 답글