https://codebunny99.tistory.com/93
MySQL DB์ Postman์ ์ฐ๋ํ์ฌ ํ์๊ฐ์ API ๋ง๋ค๊ธฐ
์ด๋ฉ์ผ ํ์์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น pip install email-validatorpip install passlibpip install psycopg2-binary DB์ postman์ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ธ์ ์ฐธ๊ณ ํ๋ค https://codebunny
codebunny99.tistory.com
์ ๋ธ๋ก๊ทธ ๊ธ์ ๋จผ์ ๋ณด๊ณ ์จ๋ค.
***** ์ค์ ******
> user_id๊ฐ ๋ ธ์ถ๋๋ฉด ์๋๋ฏ๋ก user_id๋ฅผ ์ํธํํ๋ ค๊ณ ํ๋ค.
JWT(JSON WEP TOKEN) ์ํธํ
JWT๋ ์๋ฐฉํฅ์ผ๋ก ์ํธํํ๋ ๋ฐฉ์์ผ๋ก,
JWT_ACCESS_TOKEN_EXPIRES ์ค์ ์ ์ฌ์ฉํ์ฌ ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ ์๋ ์๋ค.
JWT๋ ์์ฒด์ ์ผ๋ก Header, Body, Signature๋ก ๊ตฌ์ฑ๋๋ค.
Header : ํ ํฐ์ ํ์ , ์๋ช ์๊ณ ๋ฆฌ์ฆ ์ ๋ณด
Body : ํด๋ ์ ์ ๋ณด
Signature : ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ
Postman์์ API ์์ฒญ ์ ํค๋(Header)์ ์ธ์ฆํ ํฐ์ ๋๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
=> Body์์ user_id๊ฐ ๋ ธ์ถ๋์ด๋, Header์์ ์ธ์ฆํ ํฐ์ ๊ฑฐ์ณ์ผ ํ๋ฏ๋ก ๋์ฑ ์์ ํ๋ค
Flask-JWT-Extended ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
pip install flask-jwt-extended
config ํ์ผ์ JWT ์ํธํ๋ฅผ ์ํ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ค
#JWT ๊ด๋ จ ๋ณ์ ์
ํ
JWT_SECRET_KEY = 'djaiwnb, 12850sksj' # ์์ ๋กญ๊ฒ ์ค์ ๋
ธ์ถ๋๋ฉด ์๋จ
JWT_ACCESS_TOKEN_EXPIRES = False
PROPAGATE_EXCEPTIONS = True # JWT์์ ๋ฌธ์ ๋ฐ์ํ๋ฉด ์๋ ค๋ฌ๋ผ๋ ์ฝ๋
app.py ํ์ผ์ ์ถ๊ฐ
from flask_jwt_extended import JWTManager
from config import Config
# app = Flask(__name__) ์๋์ ์ถ๊ฐ
# ํ๊ฒฝ๋ณ์ ์
ํ
app.config.from_object(Config)
# JWT ๋งค๋์ ์ด๊ธฐํ
jwt = JWTManager(app)
# api = Api(app) ์์ ์ถ๊ฐ
user.py์ ์ถ๊ฐ, ๋ณ๊ฒฝ
from email_validator import EmailNotValidError, validate_email
from flask import request
from flask_jwt_extended import create_access_token
from mysql.connector import Error
from flask_restful import Resource
from mysql_connection import get_connection
from utils import check_password, hash_password
class UserRegisterResource(Resource) :
def post(self):
# 1. ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ค.
data = request.get_json()
print(data)
# 2. ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์๋์ง ํ์ธ
if data.get('email') is None or data.get('email').strip() == '' or \
data.get('username') is None or data.get('username').strip() == '' or \
data.get('password') is None or data.get('password').strip() == '':
return {'result' : 'fail'},400
# 3. ์ด๋ฉ์ผ์ฃผ์ ํ์์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๋ค.
try :
validate_email(data['email'])
except EmailNotValidError as e :
return {'result' : 'fail', 'error' : str(e)},400
# 4. ๋น๋ฐ๋ฒํธ ๊ธธ์ด๊ฐ ์ ํจํ์ง ์ฒดํฌํ๋ค.
# ์) ๋น๋ฒ์ 4์๋ฆฌ ์ด์ 12์๋ฆฌ ์ดํ!
if len(data['password']) < 4 or len(data['password']) > 12:
return {'result' : 'fail'}, 400
# 5. ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ ํ๋ค.
password = hash_password( data['password'] )
print(password)
# 6. DB์ ์ ์ฅํ๋ค.
try:
connection = get_connection()
query = '''insert into user
(username, email, password)
values
(%s, %s, %s );'''
record = (data['username'], data['email'], password)
cursor = connection.cursor()
cursor.execute(query, record)
connection.commit()
### DB์ ํ์๊ฐ์
ํ์ฌ, user ํ
์ด๋ธ์ insert๋ ํ,
### ์ด user ํ
์ด๋ธ์ id๊ฐ์ ๊ฐ์ ธ์์ผ ํ๋ค.
user_id = cursor.lastrowid
cursor.close()
connection.close()
except Error as e:
if cursor is not None:
cursor.close()
if connection is not None:
connection.close()
return {'result':'fail', 'error':str(e)}, 500
### 6-2. user_id๋ฅผ ๋ฐ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด๋ฉด ์๋๊ณ JWT๋ก ์ํธํํด์ ์ธ์ฆํ ํฐ์ ๋ณด๋ด์ผ ํ๋ค.
access_token = create_access_token(user_id)
# 7. ์๋ตํ ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ๋ง๋ค์ด์ ๋ฆฌํด.
return { 'result' : 'success' , 'user_id' : user_id , 'access_token' : access_token } , 200 # 200์ ๋ํดํธ๊ฐ์ด๋ฏ๋ก ์์จ๋ ๋จ
ํ์ผ์ ์ ์ฅํ๊ณ , vscode ํฐ๋ฏธ๋ cmd์ flask run ํ๋ค
send๋ฅผ ๋๋ฌ๋ณด๋ฉด ์ธ์ฆํ ํฐ์ด ์ํธํ๋์๋ค.