상세 컨텐츠

본문 제목

영화 추천 서비스 API - 로그인

API

by yjh0922 2022. 6. 23. 15:47

본문

vsc코드

# app.py 파일
#인폴트 부분
from resources.user import UserLoginResource
#작업 부분
app = Flask(__name__)

# 환경변수 셋팅
app.config.from_object(Config)
# JWT 토큰 라이브러리 만들기
app.config["JWT_SECRET_KEY"] = "super-secret"
jwt = JWTManager(app)

api = Api(app)

api.add_resource(UserLoginResource, '/users/login')

#user,py 파일
# 작업부분
class UserLoginResource(Resource) :

    def post(self) :
        # 1. 클라이언트로부터 body로 넘어온 데이터를 받아온다.
        # {
        #     "email": "a123@gmail.com",
        #     "password": "1234"
        # }

        data = request.get_json()

        # 2. 이메일로, DB에 이 이메일과 일치하는 데이터를
        # 가져온다.

        try :
            connection = get_connection()

            query = '''select *
                    from user
                    where email = %s;'''

            record = (data['email'] , )
            
            # select 문은, dictionary = True 를 해준다.
            cursor = connection.cursor(dictionary = True)

            cursor.execute(query, record)

            # select 문은, 아래 함수를 이용해서, 데이터를 가져온다.
            result_list = cursor.fetchall()

            print(result_list)

            # 중요! 디비에서 가져온 timestamp 는 
            # 파이썬의 datetime 으로 자동 변경된다.
            # 문제는! 이데이터를 json 으로 바로 보낼수 없으므로,
            # 문자열로 바꿔서 다시 저장해서 보낸다.
            i = 0
            for record in result_list :
                result_list[i]['createdAt'] = record['createdAt'].isoformat()
                i = i + 1                

            cursor.close()
            connection.close()

        except mysql.connector.Error as e :
            print(e)
            cursor.close()
            connection.close()

            return {"error" : str(e)}, 503
        # 3. result_list 의 행의 갯수가 1개이면,
        # 유저 데이터를 정상적으로 받아온것이고
        # 행의 갯수가 0이면, 요청한 이메일은, 회원가입이
        # 되어 있지 않은 이메일이다.

        if len(result_list) != 1 :
            return {'error' : '회원가입이 안된 이메일입니다.', 'error_no' : 6}, 400

        # 4. 비밀번호가 맞는지 확인한다.
        user_info = result_list[0]

        # data['password'] 와 user_info['password']를 비교

        check = check_password(data['password'] , user_info['password'])

        if check == False :
            return {'error' : '비밀번호가 맞지 않습니다.', 'error_no' : 7}, 400

        
        # JWT 억세스 토큰 생성해서 리턴해준다.
        access_token = create_access_token(user_info['id']) 
        # expires_delta=datetime.timedelta(minutes=1))

        return {'result' : 'success', 
                'access_token' : access_token}, 200

관련글 더보기