전 포스팅에서 회원가입과 로그인 API를 만들었으니,
저번에 만들었던 API를 로그인 했을 때만 사용할 수 있게 바꿔 보겠다.
바꿀 API: https://donghyeok90.tistory.com/177
1. 테이블 변경
누구나 사용할 수 있던 요리 레시피를 생성하는 API를,
로그인 한 사람만 사용할 수 있게 바꾸는 작업을 하려 한다.
가장 먼저 할 일은 기존의 테이블에 user id정보를 저장하는 컬럼을 추가해줘야 한다.
user_id 컬럼은 foreign key지만, 미리 foreign key로 지정해 놓으면 테스트 과정에서 엉킬 수 있으므로
먼저 테스트를 다 끝마치고 정상적으로 동작할 경우에, foreign key 설정을 해주도록 한다.
2. 요리 레시피를 생성하는 API
이전 코드와 달라진 부분은
1) @jwt_required()
- 이 코드는 함수 정의 바로 위에 작성해준다.
- 유효 토큰이 있을 때에만 함수로의 접근이 허용되며, 토큰이 없으면 함수가 실행되지 않는다.
2) user_id = get_jwt_identity()
- get_jwt_identity() 함수는 헤더에서 전달된 토큰을 복호화 해준다.
- 나는 user id 정보를 토큰으로 만들었으므로 복호화하면 다시 user id가 된다.
- user id를 변수에 저장해 밑의 쿼리문에서 사용한다.
3) 쿼리문
- 기존에 insert 하던 컬럼에 추가로 user_id를 저장하도록 쿼리문을 수정해줬다.
전체코드
from flask import request
from flask_restful import Resource
from mysql_connection import get_connection
import mysql.connector
from flask_jwt_extended import jwt_required, get_jwt_identity
from mysql.connector import Error
class RecipeListResource(Resource) :
# jwt 토큰이 필수라는 뜻! 토큰이 없으면, 이 API는 실행이 안된다.
@jwt_required()
def post(self):
# 1. 클라이언트가 보내준 데이터가 있으면 그 데이터를 받아준다.
data = request.get_json()
# print(data)
# 1-1. 헤더에 JWT 토큰이 있으면 토큰 정보를 받아준다.
# get_jwt_identity(): 헤더에서 전달된 토큰을 복호화하는 함수
user_id = get_jwt_identity()
# 2. 이 레시피정보를 DB에 저장해야 한다.
try:
### 1) DB에 연결
connection = get_connection()
### 2) 쿼리문 만들기(mysql workbench에서 테스트하고 복사)
query = '''insert into recipe
(name, description, num_of_servings, cook_time, directions, user_id)
values
(%s, %s, %s, %s, %s, %s);'''
### 3) 쿼리에 매칭되는 변수 처리 해준다. 튜플로!
record = (data['name'], data['description'], data['num_of_servings'],
data['cook_time'], data['directions'], user_id)
### 4) 커서를 가져온다.
cursor = connection.cursor()
### 5) 쿼리문을, 커서로 실행한다.
cursor.execute(query, record)
### 6) 커밋 해줘야, DB에 완전히 반영된다.
connection.commit()
### 7) 자원 해제
cursor.close()
connection.close()
except mysql.connector.Error as e:
print(e)
cursor.close()
connection.close()
return {"result" : "fail", "error" : str(e)}, 500
# API를 끝낼 때는
# 클라이언트에 보내줄 정보와 http 상태코드를 리턴한다(보내준다)
return {"result" : "success"}, 200
3. 포스트맨으로 테스트
이제 포스트맨에서 이전에 했던 것과 같이 테스트해보면 에러가 난다.
Authorization Header 정보를 안 줬기 때문에 @jwt_required() 부분에서 막힌 것이다.
포스트맨에 헤더 정보를 주고 테스트 해보자
먼저 전에 만들었던 로그인 API 에서 리턴하는 access_token 값을 복사한다.(" "는 빼고)
레시피 생성 API로 돌아와서 스크린샷과 같이 Headers를 작성해준다.
- KEY: Authorization 선택
- VALUE: Bearer를 입력하고 한칸 띄고 access_token 값 붙여넣기
Body는 위와 같이 작성하고, Send를 누른다.
성공했다는 메시지가 뜬다.
4. MySQL DB에서 최종 확인
select * from recipe;
레시피가 정상적으로 추가되었다.
user id 12번의 access token을 헤더에 넣어서 테스트했으므로,
DB에도 user_id 12가 저장되었다.
'REST API' 카테고리의 다른 글
Flask에서 JWT 사용하기 (flask-jwt-extended) (0) | 2023.01.05 |
---|---|
API서버 - Flask JWT를 사용한 로그아웃 API 만들기 (0) | 2023.01.05 |
API서버 - Flask JWT를 사용한 로그인 API 만들기 (0) | 2023.01.05 |
API서버 - Flask JWT를 사용한 회원가입 API 만들기 (2) | 2023.01.05 |
API서버 - Python MySQL Connector를 이용해 delete하기(DELETE 메소드) (0) | 2023.01.04 |