군침이 싹 도는 코딩

Flask 에서 JWT 회원가입 / 로그인 API에서 토큰 처리 방법 본문

Python/Flask

Flask 에서 JWT 회원가입 / 로그인 API에서 토큰 처리 방법

mugoori 2023. 1. 5. 11:13
from datetime import datetime
from flask import Flask, request
from flask_restful import Resource
from mysql.connector import Error
from mysql_connection import get_connection
from email_validator import validate_email, EmailNotValidError
from utils import hash_password
from flask_jwt_extended import create_access_token


class UserRegisterResource(Resource) :
    def post(self) :

        # {"username": "홍길동",
        # "email": "abc@naver.com",
        # "password": "1234"}

        
        data = request.get_json()
        #---------- 클라이언트가 보낸 데이터를 받아준다
        
        try :
            validate_email( data['email'] )
        #---------- 이메일 주소형식이 올바른지 확인한다

            if len(data['password']) < 4 or len(data['password']) > 12 :
                return {'error':'비밀번호 길이 확인'}, 400
        # --------- 비밀번호의 길이가 유효한지 체크한다 4자리 이상 12자리 이하라면

            hashed_password = hash_password(data['password'])
            # print(hashed_password) 암호화가 잘 됐는지 프린트해보고 주석처리
        # --------- 비밀번호를 암호화

            try :
                connection = get_connection()
                query = '''insert into user
                        (username, email, password)
                        values
                        (%s, %s, %s);'''

                record = (data['username'], data['email'], hashed_password)
        # --------- DB에 회원 정보를 저장하기 위해 쿼리문과 대체문을 만들어준다

                cursor = connection.cursor()
                cursor.execute(query, record)
                connection.commit()
        # --------- DB에 회원정보를 저장한다
        
                user_id = cursor.lastrowid
        # --------- DB에 저장된 user 테이블의 id 값을 가져오는 법

                cursor.close()
                connection.close()
        # --------- 커서와 커넥션을 닫아준다
     
            except Error as e :
                print(e)
                cursor.close()
                connection.close()
                return {'error':str(e)}, 500 
        # --------- 에러 처리     

            
        
        
            
            # config 파일에서 JWT_ACCESS_TOKEN_EXPIRES = True 했을 경우 파라미터에 만료일을 적어줘야한다
            # 예시) create_access_token(user_id, expires_delta= datetime.timedelta(days=10))
            # 해당 예시문에서는 False 이므로 따로 만료일 파라미터가 필요없다
            
            
            access_token = create_access_token(user_id), 200  
            return {'result':'success','user_id':access_token}
        # --------- user_id를 바로 클라이언트에게 보내면 안되고 JWT로 암호화 해서 인증토근을 보낸다

        except EmailNotValidError as e :
            print( str(e) )
            return {'error':str(e)}, 400
        # --------- 에러 처리