본문 바로가기
Restful API

[Restful API] Flask에서 JWT 사용하기 (회원가입 API 만들기)

by coding_su 2023. 1. 5.

📝Flask에서 JWT 사용하기 (회원가입 API 만들기)

우선 JWT를 사용하기 위해 설치를 먼저 해준다

pip install flask-jwt-extended

 

컨픽(Config)파일 클래스 안에 JWT관련 변수를 셋팅해준다

class Config :
    # JWT 관련 변수를 셋팅
    JWT_SECRET_KEY = '1234'
    JWT_ACCESS_TOKEN_EXPIRES = False # 만료없이 설정
    PROPAGATE_EXCEPTIONS = True # 에러가 나면 보여줄것

 

app.py의 환경변수 셋팅 밑에 JWT매니저 초기화 코드를 입력해준다

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

app = Flask(__name__)
# 환경변수 셋팅
app.config.from_object(Config)

# JWT 매니저 초기화
jwt = JWTManager(app)

api = Api(app)

if __name__ == '__main__' :
    app.run()

 

회원가입 API에서 토큰 생성해서 처리하는 코드를 작성

※ 이메일 주소가 올바른지 확인하기위해 라이브러리 인스톨해줬다 pip install email-validator

 비밀번호 암호화는 pbkdf2_sha256 사용 (https://coding-jisu.tistory.com/189)

from datetime import datetime
from flask import request
from flask_jwt_extended import create_access_token
from flask_restful import Resource
from myspl_connection import get_connection
from mysql.connector import Error
from email_validator import validate_email, EmailNotValidError
from utils import hash_password

class UserRegisterResource(Resource) :
    def post(self) :
        #{"username": "홍길동",
        #"email": "abc@naver.com",
        #"password": "1234"}
        # 이렇게 입력받을 데이터를 셋팅해두고 코드를 작업하면 편하다

        # 1. 클라이언트가 보낸 데이터를 받아준다
        data = request.get_json()

        # 2. 이메일주소 형식이 올바른지 확인한다
        try :
            validate_email( data["email"] )
        except EmailNotValidError as e :
            print(str(e))
            return {'error' : str(e)}, 400

        # 3. 비밀번호의 길이가 유효한지 체크한다
        # 비번이 4자리 이상 12자리 이하면 에러 (정상이 아닐때 코드를 먼저 작성)
        if len(data["password"]) < 4 or len(data["password"]) > 12 :
            return {'error' : '비밀번호 길이 확인'}, 400

        # 4. 비밀번호를 암호화한다(기존에 만든 코드를 활용)
        hashed_password = hash_password(data["password"])
        print(hashed_password)

        # 5. DB에 회원정보를 저장한다
        try :
            connection = get_connection()

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

            cursor = connection.cursor()

            cursor.execute(query, record)

            connection.commit()

            # DB에 회원가입하여 insert 된 후에 user테이블의 id값을 가져오는 코드
            user_id = cursor.lastrowid

            cursor.close()
            connection.close()

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

        # 보안상 유저 아이디를 바로 클라이언트에게 보내면 안되고 JWT로 암호화해서 인증토큰을 보낸다
        access_token = create_access_token(user_id) # 여러개는 딕셔너리로 입력
        return {"result" : "success", "access_token" : access_token}, 200

※ create_access_token(user_id, expires_delta= datetime.timedelta(minutes=30))에서

 expires_delta=는 인증토큰 만료 시간주는 것이다

 

포스트맨에서 회원가입 테스트를 해보자

※ success라 나오고 암호화된 인증토큰이 나온다

 

댓글