드레:
코딩 뿌시기
드레:
전체 방문자
오늘
어제
  • 분류 전체보기 (268)
    • Python (74)
      • Python 기초 (42)
      • Numpy (8)
      • Pandas (22)
    • Machine Learning (31)
      • Machine Learning (1)
      • Deep Learning (27)
    • AWS (22)
      • RDS (3)
      • EC2 (9)
      • Lambda (8)
      • S3 (2)
    • MySQL (24)
    • Git (8)
    • Streamlit (12)
    • REST API (22)
    • Java (24)
    • Android (36)
    • Debugging (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Python
  • Retrofit2
  • JWT
  • tensorflow
  • pandas
  • Transfer Learning
  • CNN
  • Callback
  • github
  • volley
  • Java
  • GET
  • aws s3
  • 딥러닝
  • serverless
  • Streamlit
  • rest api
  • 액션바
  • API
  • EC2
  • 서버리스
  • Lambda
  • Ann
  • AWS
  • 깃이그노어
  • flask
  • 안드로이드 스튜디오
  • 네이버 API
  • fine tuning
  • AWS Lambda

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
드레:

코딩 뿌시기

API서버 - Flask JWT를 사용해 로그인 한 유저만 처리하는 API 만들기
REST API

API서버 - Flask JWT를 사용해 로그인 한 유저만 처리하는 API 만들기

2023. 1. 5. 21:27

전 포스팅에서 회원가입과 로그인 API를 만들었으니,

저번에 만들었던 API를 로그인 했을 때만 사용할 수 있게 바꿔 보겠다.

 

바꿀 API: https://donghyeok90.tistory.com/177

 

API서버 - Python MySQL Connector를 이용해 insert하기(POST 메소드)

mysql_connection.py 파일 # MySQL에 접속하는 함수 import mysql.connector from config import Config def get_connection(): connection = mysql.connector.connect( host= Config.HOST, database= Config.DATABASE, user= Config.DB_USER, password= Config.DB_P

donghyeok90.tistory.com

 

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() 부분에서 막힌 것이다.

 

포스트맨에 헤더 정보를 주고 테스트 해보자

 

user id 12번의 로그인

 

먼저 전에 만들었던 로그인 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
    'REST API' 카테고리의 다른 글
    • Flask에서 JWT 사용하기 (flask-jwt-extended)
    • API서버 - Flask JWT를 사용한 로그아웃 API 만들기
    • API서버 - Flask JWT를 사용한 로그인 API 만들기
    • API서버 - Flask JWT를 사용한 회원가입 API 만들기
    드레:
    드레:

    티스토리툴바