RestFul API

JWT(์–‘๋ฐฉํ–ฅ) ์•”ํ˜ธํ™” ๋กœ๊ทธ์ธ API ๋งŒ๋“ค๊ธฐ

567Rabbit 2024. 5. 22. 16:35

๋กœ๊ทธ์ธ API ๋งŒ๋“ค๊ธฐ

 

 

 

 

 

app.py์— ์‚ฝ์ž…

 

from resources.user import UserLoginResource

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

 

 

app.py ํŒŒ์ผ์— ์ถ”๊ฐ€

 

from flask_jwt_extended import JWTManager
from config import Config

# app = Flask(__name__) ์•„๋ž˜์— ์ถ”๊ฐ€

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์…‹ํŒ…
app.config.from_object(Config)

# JWT ๋งค๋‹ˆ์ € ์ดˆ๊ธฐํ™”
jwt = JWTManager(app)

# api = Api(app) ์œ„์— ์ถ”๊ฐ€

 

 

 

 

 

 

user.py์— ์‚ฝ์ž…

 

from utils import check_password  #4์—์„œ ์‚ฝ์ž…
from flask_jwt_extended import create_access_token


class UserLoginResource(Resource) :
    
    def post(self) :
        
        # 1. ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค.
        data = request.get_json()

        if 'email' not in data or 'password' not in data:
            return {'result' : 'fail'}, 400
        if data['email'].strip() == '' or data['password'].strip() == '':  
            return {'result' : 'fail'}, 400
        
        # 2. DB๋กœ๋ถ€ํ„ฐ ์ด๋ฉ”์ผ์— ํ•ด๋‹นํ•˜๋Š” ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
        try :
            connection = get_connection()
            query = '''select *
                        from user
                        where email = %s ;'''
            record = ( data['email'] ,  )
            cursor = connection.cursor(dictionary=True)
            cursor.execute(query, record)

            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

        # 3. ํšŒ์›์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
        if result_list == [] :
            return {'result' : 'fail'} , 401

        
        # 4. ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฒดํฌํ•œ๋‹ค.
        
        # ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฒˆ data['password']
        # DB์— ์•”ํ˜ธํ™”๋œ ๋น„๋ฒˆ result_list[0]['password']
        isCorrect = check_password(data['password'] , result_list[0]['password'])
        if isCorrect == False :
            return {'result' : 'fail'} , 401

       
       # 5. ์œ ์ €์•„์ด๋””๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
        user_id = result_list[0]['id']

        # 6. JWT ํ† ํฐ์„ ๋งŒ๋“ ๋‹ค.
        access_token = create_access_token(user_id)

        # 7. ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ตํ•œ๋‹ค.
        return {'result' : 'success', 'access_token':access_token}

 

 

 

 

 

 

๋กœ๊ทธ์ธ ํ•œ ์œ ์ €๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก API์— ํ† ํฐ ์ ์šฉํ•˜๊ธฐ

 

 

recipe.py์— ์‚ฝ์ž…

 

from flask_jwt_extended import get_jwt_identity, jwt_required

 

 

 

(1). Class RecipeListResource ์˜ def post  : ๋ฐ์ดํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ

 

 

 

 

 

 

(2). Class RecipeListResource ์˜ def get   : ๋ฐ์ดํ„ฐ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๊ธฐ

 

 

 

 

 

 

(3). class RecipeResource์˜ def get : ํŠน์ • id ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

 

 

# 2-2 ์‚ฝ์ž…ํ•˜๊ณ  , # 3 ~ ์‚ญ์ œํ•˜๊ธฐ

 

 

 

 

 

(4). class RecipeResource์˜ def put : ํŠน์ • id ๋ฐ์ดํ„ฐ ์ˆ˜์ •ํ•˜๊ธฐ

 

 

 

 

 

 

(5). class RecipeResource์˜ def delete : ํŠน์ • id ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ

 

 

 

 

 

 


(6). class RecipePublishResource์˜ def put : ๋ ˆ์‹œํ”ผ ๋ฐœํ–‰ (publish =1)

 

 

 

 

 

 

 

(7). class RecipePublishResource์˜ def delete :  ๋ ˆ์‹œํ”ผ ๋ฐœํ–‰ ์ทจ์†Œ (publish =0) : ์ž„์‹œ์ €์žฅ

 

 

 

 

 

์ €์žฅํ•˜๊ณ  flask run

 

 

 

 

 

 

 

 

>>>> ์‚ฌ์šฉํ•  API์˜ Headers๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.


Body์— Value๋ฅผ Bearer + ์•”ํ˜ธํ‚ค ๋„ฃ๊ณ  sendํ•˜๋ฉด success ๋œ๋‹ค. (์•”ํ˜ธํ‚ค๋Š” ๋กœ๊ทธ์ธ์—์„œ ๊ฐ€์ ธ์˜จ ์•”ํ˜ธํ‚ค๋ฅผ ๋ณต๋ถ™ํ•œ๋‹ค)

 

 

>>> ๋‚˜๋จธ์ง€๋„ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค