API 개발/Restful API

Restful API : 로그인한 유저만 처리할수 있는 API에, 토큰 적용하는 방법

신강희 2024. 5. 28. 17:39
728x90

< 로그인한 유저만 처리할수 있는 API에, 토큰 적용하는 방법 >

 

# 로그인한 유저일경우에만 API가 동작하도록 개발해 보자

- 레시피앱을 예시로 내 레시피를 가져오거나 수정, 삭제, 발행, 임시저장 같은 API는 로그인(토큰)이 필요하도록 설계

- 우선 Postman을 실행해서 API 설계 및 리퀘스트 생성

 

# 인증 토큰을 입력해야 실행되도록 설계하는 방법!

1) 일반 API와 다르게 HeaderskeyValue를 생성해 주어야 한다!

2) Key 값은 Authorization으로 설정

3) Value에는 Bearer 입력후 한칸 띄고 회원가입 혹은 로그인 API 실행으로 생성된 토큰을 붙여준다.

4) 이렇게 설정해주면 인증토큰이 일치하지 않을경우 API가 동작하지 않는다.

 

# 이제 Visual Studio Code를 실행하여 코드문을 수정해 준다.

- 같은 카테고리내에 있는 select, post, get 게시글의 코드문을 수정

- 레시피를 생성하는 API를 예시로 수정!

# 항목이 추가됨

@jwt_required()

user_id = get_jwt_identity()
 
from flask import request
from flask_jwt_extended import get_jwt_identity, jwt_required
from flask_restful import Resource

from mysql_connection import get_connection
from mysql.connector import Error

class RecipeListResource(Resource) :
    # 레시피를 생성하는 API

    # JWT 토큰이 헤더에 있어야지만 이 API를 실행할수 있다는 뜻
    # JWT 토큰이 필수로 필요하도록 지정하는 함수!! == 로그인한 유저만 이 API 실행이 가능하다.
    # JWT 토큰 생성후 1-1. 과정 추가함
    @jwt_required()

    def post(self) :

        # 1. 클라이언트가 보내준 데이터가 있으면
        #    그 데이터를 받아준다.

        data = request.get_json()

        # 1-1. 헤더에 JWT 토큰이 있으면, 토큰 정보도 받는다.
        user_id = get_jwt_identity()

        # 2. 이 정보를 DB에 저장한다. (MySQL 커넥터를 사용하는 순서)
        try :
            ### 1. DB에 연결
            connection = get_connection()

            ### 2. 쿼리문 만들기
            query = '''insert into recipe
                    (user_id, name, description, num_of_servings, cook_time, directions)
                    values
                    ( %s, %s, %s, %s, %s, %s );'''

            ### 3. 쿼리에 매칭되는 변수 처리 => 튜플로!!
            record = (user_id, data['name'], data['description'], data['num_of_servings'], data['cook_time'], data['directions'])

            ### 4. 커서를 가져온다.
            cursor = connection.cursor()

            ### 5. 쿼리문을 커서로 실행한다.
            cursor.execute(query, record)

            ### 6. DB에 완전히 반영하기 위해서는 commit 한다.
            connection.commit()

            ### 7. 자원 해제
            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

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

 

이렇게 구문을 추가하게 되면 토큰이 없이는 동작되지 않는다.

다음 게시글로 계속~!

 

반응형