카테고리 없음
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
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
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" : "다른 사람의 레시피를 수정할 수 없습니다."}
헤더 부분에 로그인 시 발급받은 토큰을 입력하고, 자신이 입력한 레시피가 아닐 시 수정할 수 없다.
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