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
# 유저가 로그인 할때, 입력한 비밀번호가 맞는지 체크하는 함수
def check_password(original_password, hashed_password):
password = original_password + Config.SALT
check = pbkdf2_sha256.verify(password, hashed_password)
return check
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을 리턴하게 만든다.
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, jwt_required, get_jwt
from mysql_connection import get_connection
from utils import check_password, hash_password
class UserLoginResource(Resource):
def post(self):
# 클라이언트로부터 받는 json 형태
# {
# "email": "tnwhd99@gmail.com",
# "password": "akwmvow"
# }
# 1. 클라이언트가 보낸 데이터를 받아온다.
data = request.get_json()
# 2. DB로부터 해당 유저의 데이터를 가져온다.
try:
connection = get_connection()
query = '''select *
from user
where email = %s;'''
record = (data['email'], )
cursor = connection.cursor(dictionary=True)
cursor.execute(query, record)
result_list = cursor.fetchall()
# if len(result_list) == 0:
if not result_list:
return {'error' : '회원가입한 사람이 아닙니다.'}, 400
# DB의 timestamp컬럼이 자동으로 datetime으로 변환되어
# json으로 보낼 수 없으므로 문자열로 변환해준다.
i = 0
for row in result_list:
result_list[i]['created_at'] = row['created_at'].isoformat()
result_list[i]['updated_at'] = row['updated_at'].isoformat()
i += 1
cursor.close()
connection.close()
except Error as e:
print(e)
cursor.close()
connection.close()
return {'error' : str(e)}, 500
# print(result_list)
# 3. 비밀번호가 맞는지 확인한다.
check = check_password(data['password'], result_list[0]['password'])
if check == False:
return {'error' : '비밀번호가 틀립니다.'}, 400
# 4. JWT 토큰을 만들어서 클라이언트에게 보낸다.
access_token = create_access_token( result_list[0]['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, UserLoginResource
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')
api.add_resource(UserLoginResource, '/user/login')
if __name__ == '__main__':
app.run()
6. MySQL 회원정보
select * from user
7. 포스트맨으로 테스트
user id 12번 이승기가 로그인 했을 때
user id 12라는 정보를 token으로 만들어 리턴해준다.
'REST API' 카테고리의 다른 글
API서버 - Flask JWT를 사용한 로그아웃 API 만들기 (0) | 2023.01.05 |
---|---|
API서버 - Flask JWT를 사용해 로그인 한 유저만 처리하는 API 만들기 (0) | 2023.01.05 |
API서버 - Flask JWT를 사용한 회원가입 API 만들기 (2) | 2023.01.05 |
API서버 - Python MySQL Connector를 이용해 delete하기(DELETE 메소드) (0) | 2023.01.04 |
API서버 - Python MySQL Connector를 이용해 update하기(PUT 메소드) (0) | 2023.01.04 |