본문 바로가기

BackEnd

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

반응형
로그인한 유저만 처리할 수 있는 API에 JWT 토큰 적용하는 방법

 

 

 

class RecipeListResource(Resource):
    # restful api 의 method 에 해당하는 함수 작성
    # jwt_required = api를 호출하려면 header부분에 Authorization key값이 없으면 처리를 하지 않는다.
    @jwt_required()
    def post(self) :
        # api 실행 코드를 여기에 작성

        # 클라이언트에서, body 부분에 작성한 json 을
        # 받아오는 코드
        data = request.get_json()

        # 암호화 한 token을 다시 보이게하는 코드
        user_id = get_jwt_identity()


        # 받아온 데이터를 디비 저장하면 된다.
        try :
            # 데이터 insert 
            # 1. DB에 연결
            connection = get_connection()

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

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

            # 4. 쿼리문을 커서를 이용해서 실행한다.
            cursor.execute(query, record)

            # 5. 커넥션을 커밋해줘야 한다 => 디비에 영구적으로 반영하라는 뜻
            connection.commit()

            # 6. 자원 해제
            cursor.close()
            connection.close()

        except mysql.connector.Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {"error" : str(e)}, 503

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

 

 

CODE 작성 후 python app.py로 서버를 실행시킨다.

 

 

 

POSTMAN 로그인 API에서 등록해놨던 회원정보 입력으로 토큰을 불러온 후 토큰을 복사한다.

 

 

 

 

 

작업을 위해 작성했던 코드의 API로 이동한뒤

 

Headers를 클릭 - 체크박스 체크 = Authorization 입력 - 'Bearer ' + Token

 

순서로 입력해준다.

 

 

 

 

 

body로 돌아가 추가할 문구를 JSON으로 입력 후 SEND를 클릭한다.

 

 

 

 

MySQL Workbench에서 DB를 확인한다.

 

 

 

 

 

update해보기

 

 

# 데이터를 업데이트하는 API들은 PUT 함수를 사용한다.
    @jwt_required()
    def put(self, recipe_id) :

        # body에서 전달된 데이터를 처리
        data = request.get_json()

        user_id = get_jwt_identity()

        # DB 업데이트 실행 코드        
        try :
            # 데이터 insert
            #1. DB에 연결
            connection = get_connection()

            # 먼저 recipe_id에 들어있는 user_id가
            # 이사람인지 먼저 확인한다.

            query = '''select user_id
                        from recipe
                        where id = %s'''

            record = (recipe_id, )

            cursor = connection.cursor(dictionary = True)

            cursor.execute(query, record)

            result_list = cursor.fetchall()

            recipe = result_list[0]

            if recipe['user_id'] != user_id :
                cursor.close()
                connection.close()

                return {'error' : '남의 레시피를 수정할 수 없습니다.'}, 401

            #2. 쿼리문 만들기
            query = '''update recipe
                    set name = %s, description = %s,
                    cook_time = %s, directions = %s
                    where id = %s ;'''

            record = ( data['name'], data['description'], data['cook_time'], data['directions'], recipe_id )

            #3. 커서를 가져온다.
            cursor = connection.cursor()
            #4. 쿼리문을 커서를 이용해서 실행한다.
            cursor.execute(query, record)
            #5. 커넥션을 커밋해줘야 한다. => 디비에 영구적으로 반영하라는 뜻
            connection.commit()
            #6. 자원 해제
            cursor.close()
            connection.close()

        # 정상적이지 않을때
        except mysql.connector.Error as e :
            print(e)
            cursor.close()
            connection.close()

            return {'error' : str(e)}, 503


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

 

 

 

마찬가지로 로그인 api를 이용해 토큰을 복사한다.

 

 

 

 

update 할 API로 이동에 Headers에 필요한 내용을 입력한다.

 

 

 

 

 

위에서 DB에 등록한 recipe_id와 user_id를 확인한다.

 

 

 

 

 

POSTMAN에서 DB에 등록된 내용을 바탕으로 경로를 지정하고

 

body에서 수정할 문구를 입력해 준다.

 

 

 

 

 

DB에서 확인

 

 

 

 

위의 코드에서 설정한대로

 

다른 계정에서 기록한 내용을 바꾸려 한다면 어떻게 될지 확인해보자

 

( 연습삼아 다른 토큰을 적용하기 위해 로그인 API에서 다른 아이디로 로그인 해보자 )

 

 

 

 

수정하는  update API에서 토큰 변경

 

 

 

 

방금 변경했던 11번 recipe_id의 된장찌개를 부대찌개로 변경하려하니

 

다른 계정이기 때문에 하단에 error와 함께 경고문구가 나타나게 된다.

 

이렇게 토큰을 설정 해두면 다른사람이 내기록을 수정하거나 내가 다른사람 기록을 수정하는

 

보안적인 측면에서 강화됨을 알 수 있고, 조금 더 api스러워졋다.

 

 

반응형