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 |