카테고리 없음

Flask에서 JWT 사용하는 방법

zzuvely 2022. 6. 20. 17:56

Flask에서 JWT 사용법

 

1) 설치 방법

 

# 라이브러리 설치
$ pip install flask-jwt-extended

 

2) 회원가입 / 로그인 API에서 토큰 생성해서 처리하는 방법

 

회원가입 url : '/users/register'
회원가입 클래스 : UserRegisterResource

로그인 url : '/users/login'
로그인 클래스 : UserLoginResource

 

2-1) 회원가입 : 사용자 이름, 이메일, 비밀번호 입력

 

유효한 이메일인지 체크하는 라이브러리 사용

 

# 라이브러리 설치
$ pip install email-validator

 

회원가입 시, 입력한 비밀번호를 암호화해주는 함수 생성

 

from passlib.hash import pbkdf2_sha256

# 원문 비밀번호를 암호화 하는 함수
def hash_password(original_password) :
    salt = 'yh*hello12'
    password = original_password  + salt
    password = pbkdf2_sha256.hash(password)
    return password

 

회원가입 API에서 토큰 생성해서 처리

 

# user_id 를 바로 보내면 안되고,
# JWT로 암호화해서 보내준다.
# 암호화하는 방법

# create_access_token(identity=username) : 사용자의 username을 서명하여 Access 토큰을 발급하는 메서드.
access_token = create_access_token(user_id)

return {"result" : "success", 'access_token' : access_token}, 200

 

회원가입 API

 

2-2) 로그인 : 이메일 , 비밀번호 입력

 

로그인 시 입력한 비밀번호와 DB에 저장된 비밀번호가 맞는지 확인하는 함수

 

from passlib.hash import pbkdf2_sha256

# 비밀번호가 맞는지 확인하는 함수, True / False를 리턴한다.
def check_password(original_password, hashed_password) :
    salt = 'yh*hello12'
    check = pbkdf2_sha256.verify(original_password+salt, hashed_password)
    return check

 

로그인 API에서 토큰 생성해서 처리

 

access_token = create_access_token(user_info['id'], expires_delta=datetime.timedelta(minutes=1))

return {"result" : "success", "access_token" : access_token}, 200

 

로그인 API

 

3) 로그인한 유저만 처리할 수 있는 API에 토큰 적용하는 방법

 

Config 파일에 키, 토큰의 유효 시간에 대한 정보를 따로 정의

 

class Config :
    # 서명에 사용되는 Key 이고 직접 String으로 정의
    JWT_SECRET_KEY = 'yhacademy0317##hello'
    # Access 토큰의 만료 시간
    JWT_ACCESS_TOKEN_EXPIRES = False
    # 명시적으로 예외를 전파하는 것에 대한 활성화함(True)
    PROPAGATE_EXCEPTIONS = True

 

로그인한 유저만 처리할  수 있는 API(수정, 삭제 등)에 토큰 적용

 

@jwt_required()
    def put(self, recipe_id) :

        data = request.get_json()

        user_id = get_jwt_identity()
        
         try 
         
            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" : "다른 사람의 레시피를 수정할 수 없습니다."}

 

헤더 부분에 로그인 시 발급받은 토큰을 입력하고, 자신이 입력한 레시피가 아닐 시 수정할 수 없다.

 

레시피 수정 API

 

4) 토큰 유효기간 만료시키는 방법

 

import datetime

# 로그인 후 1분 뒤면 토큰이 만료되어 다시 로그인해야 한다.
access_token = create_access_token(user_info['id'], expires_delta=datetime.timedelta(minutes=1))

return {"result" : "success", "access_token" : access_token}, 200

 

토큰 시간 만료