본문 바로가기
Restful API

[Restful API] flask에서 JWT 사용하는 방법

by dong_su 2023. 12. 7.
 pip install flask-jwt-extended

-> 먼저, 인증 토큰 발급을 위한 라이브러리를 설치한다.  

 

class Config :
    JWT_SECRET_KEY = 'Hi'
    JWT_ACCESS_TOKEN_EXPIRES = False
    PROPAGATE_EXCEPTIONS = True

-> git에 올라가지 않게 보안을 위해 만든 Config 클래스 안에 JWT 관련 변수를 세팅한다.

 

from flask import Flask
from flask_jwt_extended import JWTManager
from flask_restful import Api
from config import Config

# 환경변수 세팅
app.config.from_object(Config)
# JWT 매니저를 초기화
JWTManager(app)

-> app.py에 코드 추가

 

def post(self) :
        # 1. 클라이언트가 보낸 데이터를 받는다.
        data = request.get_json()

        # 2. 이메일 주소 형식이 올바른지 확인한다.
        try :
            validate_email(data["email"])
        except EmailNotValidError as e :
            print(e)
            return {"error" : str(e)}, 400
        
        # 3. 비밀번호 길이가 유효한지 체크한다.
        # 만약, 비번이 4자리 이상 14자리 이하라고 한다면 확인한다.
        if len(data["password"]) < 4 or len(data["password"]) > 14 :
            return {"error" : "비밀번호 길이가 올바르지 않습니다."}, 400
        
        # 4. 비밀번호를 암호화 한다.
        password = hash_password(data["password"])

        # 5. DB의 user 테이블에 저장
        
        try :
            connection = get_connection()

            query = '''
                    insert into user
                    (username, email, password)
                    values
                    (%s, %s, %s);                    
                    '''
            
            record = (data["username"], data["email"], password)

            cursor = connection.cursor()
            cursor.execute(query, record)
            connection.commit()

            ### 테이블에 방금 insert한 데이터의 id를 가져오는 방법
            user_id = cursor.lastrowid
            
            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {"result" : "fail", "error" : str(e)}, 500

        # 6. user 테이블의 id로 JWT 토큰을 만들어야 한다.
        access_token = create_access_token(user_id)

        # 7. 만든 JWT 토큰을 클라이언트에게 준다.
        return {"result" : "success", "access_token" : access_token}, 200

-> create_access_token() 함수로 JWT 토큰을 생성한다.