RestFul API

instargram 사진 포스팅 API (2) 회원가입, 로그인, 로그아웃 API

567Rabbit 2024. 5. 30. 17:54

 

MySQL user 테이블 작성하기

 

 

 

 

app.py 작성하기

import serverless_wsgi

from flask import Flask
from flask_jwt_extended import JWTManager
from flask_restful import Api

from config import Config

from resources.user import jwt_blacklist

from resources.user import UserRegisterResource
from resources.user import UserLoginResource
from resources.user import UserLogoutResource


app = Flask(__name__)

# 환경변수 셋팅
app.config.from_object(Config)

# JWT 매니저 초기화
jwt = JWTManager(app)

# 로그아웃된 토큰으로 요청하는 경우, 처리하는 함수 작성
@jwt.token_in_blocklist_loader
def check_if_token_is_revoked(jwt_header, jwt_payload):
    jti = jwt_payload['jti']
    return jti in jwt_blacklist

def handler(event, context) :
    return serverless_wsgi.handle_request(app, event, context)

api = Api(app)

api.add_resource( UserRegisterResource, '/user/register')
api.add_resource( UserLoginResource, '/user/login')
api.add_resource( UserLogoutResource, '/user/logout')


if __name__ == '__main__' :
    app.run()

 

 

 

 

user.py 만들고 임포트하기

from email_validator import EmailNotValidError, validate_email
from flask import request
from flask_jwt_extended import create_access_token, get_jwt, jwt_required
from flask_restful import Resource
from mysql.connector import Error
from mysql_connection import get_connection
from utils import check_password, hash_password

 

 

 

 

회원가입 class 만들기

class UserRegisterResource(Resource) :

    def post(self) :

        # 보낸 데이터 받기
        data = request.get_json()
        print(data)

        # 회원가입 데이터가 모두 있는지 확인
        if 'email' not in data or 'password' not in data :
            return {"result":"fail"}, 401
        
        if data['email'].strip() == '' or data['password'].strip() == '' :
            return {"result":"fail"}, 401
        
        print('데이터 확인 완료')
        
        # 다 통과 이메일 확인하기
        try :
            validate_email(data['email'])
        except EmailNotValidError as e :
            return {"result":"fail"}, 401
        
        print('이메일 확인')
        
        # 비밀번호 길이 유효 확인
        if len(data['password']) < 4 or len(data['password']) > 12 :
            return {"result":"fail"}, 401
        
        print('비밀번호 확인')
        
        # 비밀번호 암호화
        password = hash_password(data['password'])
        print(password)

        # DB에 회원정보 저장
        try :
            connection = get_connection()

            query = '''
                    insert into user
                    (email, password)
                    values
                    (%s, %s);'''
            recode = ( data['email'], password)

            cursor = connection.cursor()
            cursor.execute(query, recode)

            connection.commit()

            user_id = cursor.lastrowid

            cursor.close()
            connection.close()


        except Error as e :
            if cursor is not None :
                cursor.close()
            if connection is not None :
                connection.close()
            return {"result":"fail", "error":str(e)}, 500

        # 유저아이디로 토큰 생성
        accessToken = create_access_token(user_id)

        # 응답하기
        return {"result":"seccess", "accessToken":accessToken}

 

 

포스트맨 설정하고 send하여 결과 확인하기

 

 

 

 

 

로그인 class 만들기

class UserLoginResource(Resource) :
    
    def post(self) :
        
        data = request.get_json()

        print(data)

        if 'email' not in data or 'password' not in data :
            return {"result":"fail"}, 401
        
        if data['email'].strip() == '' or data['password'].strip() == '' :
            return {"result":"fail"}, 401
        
        # DB에서 유저 정보 가져오기
        try :
            connection = get_connection()

            query = '''
                    select *
                    from user
                    where email = %s;'''
            recode = ( data['email'] , )
        
            cursor = connection.cursor(dictionary=True)
            cursor.execute(query, recode)

            result_list = cursor.fetchall()
            print(result_list)

            cursor.close()
            connection.close()

        except Error as e :
            if cursor is not None :
                cursor.close()
            if connection is not None :
                connection.close()
            return {"result":"fail", "error":str(e)}, 500
        
        if result_list == [] :
            return {"result":"fail"}, 401
        
        isCorrect = check_password(data['password'], result_list[0]['password'])
        if isCorrect == False :
            return {"result":"fail"}, 401
        
        userId = result_list[0]['id']

        accessToken = create_access_token(userId)

        return {"result":"seccess", "accessToken":accessToken}

 

 

 

포스트맨 설정하고 send하여 결과 확인하기

 

 

 

 

 

로그아웃 class 만들기

jwt_blacklist = set()

class UserLogoutResource(Resource) :

    @jwt_required()
    def delete(self) :
        
        jti = get_jwt()['jti']
        jwt_blacklist.add(jti)
        
        return {"result":"success"}, 200

 

 

 

포스트맨 설정하고 send하여 결과 확인하기

 

 

 

 

MySQL에 반영되었다.

 

select * from user;