본문 바로가기
RESTFUL API 개발

[API] JWT 토큰 있어도 되고, 없어도 되는 API 만들기 _ @jwt_required(optional=True)

by 처카푸 2024. 7. 12.

JWT 토큰 있어도 되고, 없어도 되는 API 만들기 

-> @jwt_required(optional=True)

 

앱에서 api를 사용하는데 로그인 한 사용자도 볼 수 있고,

로그인하지 않은 사용자도 볼 수 있는 코드를 만들고 싶었다.

 

찾아보니, optional=True 파라미터를 사용하면 해결되었다.

 

@jwt_required(optional=True) 활용한 코드

class FlowersListResource(Resource):
    
    # 오늘의 꽃 가져오는 API
    @jwt_required(optional=True)
    def get(self) :
        
        # 1. 클라이언트가 보낸 데이터가 있으면 받아준다.
        
        userId = get_jwt_identity()

        # 2. DB로 부터 데이터를 가져온다.
        try : 
            connection = get_connection()
            
            # 문자열 더하라는 뜻 '''+data변수명+'''
            query = '''
                    select id flowerId, flowerName, flowerPrice, flowerPhotoUrl, createdAt, updatedAt, status, origin, if( w.userid = %s , 1, 0) as isWish
                    from flower f
                    left join wish w
                        on f.id = w.flowerId;
                    '''
            
            # 사용자 ID가 None인 경우를 처리
            if userId is None:
                record = (0,)  # 일반 사용자를 위한 기본값
            else:
                record = (userId,)

            cursor = connection.cursor(dictionary=True)

            cursor.execute( query, record )

            # 데이터를 가져와야한다.
            result_list = cursor.fetchall()

            cursor.close()
            connection.close()

        except Error as e:
            # try에서 에러가 발생하면 클라이언트한테 리턴해준다.
            # json 은 숫자 아니면 문자열만 있다!!!
            if cursor is not None :
                cursor.close()
            if connection is not None :
                connection.close()
            return {'result':'fail', 'error':str(e)}, 500

        # 3. 클라이언트에게 json만들어서 응답한다.
        i = 0
        for row in result_list :
            result_list[i]['createdAt']= row['createdAt'].isoformat()
            result_list[i]['updatedAt']= row['updatedAt'].isoformat()
            i = i + 1

        print()
        print(result_list)

        return {'items' : result_list,
                'count' : len(result_list),
                'result' : 'success'}

 

포스트맨으로 확인했을 로그인 한 사용자와 안 한 사용자 모두 데이터를 잘 받아오는 것을 확인할 수 있었다!!