ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL. 62 회원가입, 로그인 _ HTTP 통신
    TIL 2020. 12. 9. 23:32
    728x90

    내가 만든 백엔드 서버와 이미 구현되어있는 프론트 서버를 서로 연결하여 실제로 통신이 잘 되는지

    에러 및 DB 접속은 원활한지 확인하는 시간을 가졌다.

     

    복기 차원에서 하나하나씩 되짚어보도록하자

    1.  혼자서 Project 진행 당시 httpie 로 요청을 보낼때 POST 메서드와 GET 메서드로 URL 요청을 분리하여사용하였다.

    POST 요청시 -> Signup View로 연결

    GET 요청시  -> Signin View 로 연결 해주었다.

    따라서 혼자 로컬서버를 띄워보고 통신할때는 문제가 없었으나 회원가입의 엔드포인트와 로그인의 엔드포인트는 모두

    POST 메서드를 통해 요청이 들어왔다

    이에 따라 SigninView를 새로 클래스를 구성하여 같은 POST 메서드에서도 URL 엔드포인트에 따라 알맞는 View로 연결시켜주었다.

    또한 코드간 에러를 발견하여 코드를 대폭 수정하여 사용하였다.

    user/views.py

    import json, re, bcrypt, jwt
    from django.http     import JsonResponse
    from django.views    import View
    from django.core.exceptions import ValidationError
    from user.models import User
    from my_settings import SECRET_KEY, ALGORITHM
    
    
    class UserView(View):
        def post(self, request):
            data = json.loads(request.body)
            user_email = '^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{3})$'
            user_HP = '^[0-9]{3}-[0-9]{4}-[0-9]{4}$'
            user_id = '^[a-z0-9_-]{2,10}$'
            password = '^\w{8, 15}$'
    
            try:
                input_name = data['name']
                input_pw = data['password']
            except:
                return JsonResponse({"message": "KEY_ERROR"}, status=400)
    
            # Key val
            if not re.match(user_email, data['name']) and not re.match(user_HP, data['name']) and not re.match(user_id, data['name']):
                return JsonResponse({"message": "KEY_ERROR"}, status=400)
                
            # Email val
            #
            #if not re.match(user_email, data['name']) and not re.match(user_HP, data['name']):
            #        return JsonResponse({"message": "EMAIL_ERROR"}, status=400)
    
            # Password val
            if len(data['password']) < 8:
                    return JsonResponse({"message": "PW_ERROR"}, status=400)
    
            # hashed_pw
            hashed_pw = bcrypt.hashpw ( data['password'].encode('utf-8'), bcrypt.gensalt())
    
            # info_overlap
            if not User.objects.filter(user_name=data['name']):
                User.objects.create(user_name=data['name'], password=hashed_pw.decode('utf-8'))
                return JsonResponse({'MESSAGE' : 'SUCCESS'}, status=201)
            return JsonResponse({'MESSAGE' : 'INFO_OVERLAP_ERROR'}, status=400)
            
      class SigninView(View):
        def post(self, request):
            get_data = json.loads(request.body)
    
            # Key_error
            get_user_name = get_data['name']
            get_password  = get_data['password']
            if get_password == '' or '@' not in get_data['name'] or '.' not in get_data['name']:
                return JsonResponse ({'message': 'KEY_ERROR'}, status=400)
    
            try:
                User_get = User.objects.get(user_name=get_data['name'])
            except:
                return JsonResponse({"message": "INVALID_USER"}, status=401)
    
            # check_pw validation
            User_pw     = User_get.password
            hash_pw_get = User_pw.encode('utf-8')
            if bcrypt.checkpw (get_data['password'].encode('utf-8'), hash_pw_get):
                # token create
                token     = jwt.encode({'user-id' : User_get.id}, SECRET_KEY, ALGORITHM)
                token_str = token.decode('utf-8')
                return JsonResponse({'TOKEN' : token_str}, status=201)
            return JsonResponse({'MESSAGE' : 'PW_ERROR'}, status=400)

     

    2. 서버 외부접속 허용 및 서버 구동시

    ALLOWED_HOSTS ==> 보통 정확하게 IP주소를 정해주는게 좋지만 우선은 다 허용해주자

    서버 구동시 -> 0.0.0.0:8000 / or 0:8000 (규칙이다)

    Doker,  AWS 상에서 서버를 띄울때도 같이 사용한다.

    위와 같이 서버를 구동시켜야 접속을 허용할 수 있게 된다.

     

    3. 공유해야할 사항

    내 컴퓨터로 접속하기 위해서 

    클라이언트는

    호스트 서버의 주소(ip) 와 포트(8000)

    요청을 보내는 대상(Request taget)

    엔드포인트 URL 주소   

    필요한 Key  등의 정보를  알아야 우리 서버에 들어와 기능을 정확히 사용할 수 있다.

    Request target

     

     


    4. 예외처리는 잘 되어 있는지

    예외처리에 따라 어떤 서버에서 문제가 있는지 파악이 쉬우며

    회원가입과 로그인하는 상황에 대한 적절한 예외를 모두 처리해주어야

    예외가 발생하였을때 프론트서버에게 그 예외를 알려줄수있다.


    5. 아래와 같은 자료를 클론받아 http 통신을 해 볼 수 있었다.

    서버주소: http://IP:8000

    회원가입 엔드포인트의 URL / 로그인 엔드포인트의 URL

    또한 내 서버의 Key에 해당하는 값을 선택 후 실제로 로컬서버를 띄우고

    개발자도구의 Console 화면에서 예외 처리, 회원가입, 로그인, 토큰 등의 값을 확인 할 수 있다

    해당 실습용 프론트 서버를 이용하는 것이므로 나의 로직과 예외처리만 잘되어있다면 정상동작하는지 확인 할 수 있다.


    # 신규 회원가입

    1. popopo@naver.com / 09240924

     

    # 로그인

     

    #기타 예외들

     

    점점 하루종일 코딩을 해도 시간이 모자르고있다.

    내가 참 대견하고 좋다.

    728x90

    'TIL' 카테고리의 다른 글

    TIL.67 Trello 다루기  (0) 2020.12.14
    TIL.66 스크럼(Scrum)  (0) 2020.12.13
    TIL.61 Bcrypt, Pyjwt (암호화)  (0) 2020.12.08
    TIL.60 인증 & 인가 (Hash/Hashing)  (0) 2020.12.07
    TIL.56 SPA_UX 및 개발자  (0) 2020.12.04
Designed by Tistory.