드레:
코딩 뿌시기
드레:
전체 방문자
오늘
어제
  • 분류 전체보기 (268)
    • Python (74)
      • Python 기초 (42)
      • Numpy (8)
      • Pandas (22)
    • Machine Learning (31)
      • Machine Learning (1)
      • Deep Learning (27)
    • AWS (22)
      • RDS (3)
      • EC2 (9)
      • Lambda (8)
      • S3 (2)
    • MySQL (24)
    • Git (8)
    • Streamlit (12)
    • REST API (22)
    • Java (24)
    • Android (36)
    • Debugging (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Python
  • rest api
  • flask
  • github
  • 딥러닝
  • Retrofit2
  • Java
  • 네이버 API
  • aws s3
  • AWS Lambda
  • tensorflow
  • volley
  • serverless
  • 액션바
  • API
  • fine tuning
  • GET
  • 서버리스
  • JWT
  • 깃이그노어
  • Transfer Learning
  • Ann
  • CNN
  • pandas
  • Callback
  • Lambda
  • 안드로이드 스튜디오
  • Streamlit
  • AWS
  • EC2

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
드레:

코딩 뿌시기

API서버 - Flask JWT를 사용한 회원가입 API 만들기
REST API

API서버 - Flask JWT를 사용한 회원가입 API 만들기

2023. 1. 5. 18:10

0. user 테이블 구조

 

1. MySQL에 접속하는 함수

# mysql_connection.py 파일
import mysql.connector

from config import Config 

def get_connection():

    connection = mysql.connector.connect(
        host= Config.HOST,
        database= Config.DATABASE,
        user= Config.DB_USER,
        password= Config.DB_PASSWORD
    )
    return connection

 

 

2. 비밀번호를 암호화하는 함수

비밀번호는 개발자도 파악할 수 없도록 단방향 암호화한다.

# utils.py 파일
from passlib.hash import pbkdf2_sha256

from config import Config

# 원문 비밀번호를, 단방향 암호화하는 함수
def hash_password(original_password):
    
    password = original_password + Config.SALT
    password = pbkdf2_sha256.hash(password)
    return password

 

 

3. 민감한 변수 관리

노출이 되면 안되는 변수들은 보안을 위해 따로 파일을 만들어 관리한다.

# config.py 파일
class Config :
    HOST = 주소
    DATABASE = DB명
    DB_USER = 유저명
    DB_PASSWORD = 비밀번호
    SALT = 솔트

    # JWT 관련 변수 셋팅
    JWT_SECRET_KEY = 암호화키
    JWT_ACCESS_TOKEN_EXPIRES = False  # 토큰만료설정
    PROPAGATE_EXCEPTIONS = True  # 명시적으로 예외를 전파

 

 

4. 회원가입 API

회원가입하면 정보를 저장하는 것 뿐만 아니라,

flask_jwt_extended 라이브러리를 사용해 access token을 리턴하게 만든다.

 

# resources.user.py 파일

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

from mysql_connection import get_connection
from utils import hash_password

class UserRegisterResource(Resource):
    def post(self):
    	# 클라이언트로부터 받는 json 형태
        # {
        # "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


        ### user_id를 바로 클라이언트에게 보내면 안되고,
        ### JWT로 암호화해서, 인증토큰을 보낸다.
		
        # 토큰 만료기간 설정할 시,
        # create_access_token(user_id,
        #                     expires_delta=datetime.timedelta(days=10))
        access_token = create_access_token(user_id)

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

 

 

5. 메인파일 

# app.py 파일

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

from resources.user import UserRegisterResource



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

# JWT 매니저 초기화(initialize)
# JWTManager(app)을 설정해줘야 flask istance에서 jwt를 사용할 수 있게 된다.
jwt = JWTManager(app)


api = Api(app)

# 경로와 리소스를 연결한다.
api.add_resource(UserRegisterResource, '/user/register')


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

 

 

6. 포스트맨으로 테스트

정상적으로 작동하고 access token도 리턴한다.

 

7. DB에 반영

정상적으로 DB에 추가됐다.

'REST API' 카테고리의 다른 글

API서버 - Flask JWT를 사용해 로그인 한 유저만 처리하는 API 만들기  (0) 2023.01.05
API서버 - Flask JWT를 사용한 로그인 API 만들기  (0) 2023.01.05
API서버 - Python MySQL Connector를 이용해 delete하기(DELETE 메소드)  (0) 2023.01.04
API서버 - Python MySQL Connector를 이용해 update하기(PUT 메소드)  (0) 2023.01.04
API서버 - Python MySQL Connector를 이용해 select하기(GET 메소드)  (0) 2023.01.04
    'REST API' 카테고리의 다른 글
    • API서버 - Flask JWT를 사용해 로그인 한 유저만 처리하는 API 만들기
    • API서버 - Flask JWT를 사용한 로그인 API 만들기
    • API서버 - Python MySQL Connector를 이용해 delete하기(DELETE 메소드)
    • API서버 - Python MySQL Connector를 이용해 update하기(PUT 메소드)
    드레:
    드레:

    티스토리툴바