로그인한 유저만 처리할 수 있는 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스러워졋다.

'BackEnd' 카테고리의 다른 글
| API - PASSWORD 암호화 설정 방법 (0) | 2022.06.20 |
|---|---|
| API - JWT 유효기간 만료시키는 방법 (0) | 2022.06.20 |
| API - 회원가입 / 로그인 API에서, 토큰 생성해서 처리하는 방법 (0) | 2022.06.20 |
| API - Flask에서 JWT 설치방법 (0) | 2022.06.20 |
| API - Python flask에서, Resource 클래스를 이용한 API 서버 개발 방법 (0) | 2022.06.19 |