MySQL user 테이블 작성하기
app.py 작성하기
import serverless_wsgi
from flask import Flask
from flask_jwt_extended import JWTManager
from flask_restful import Api
from config import Config
from resources.user import jwt_blacklist
from resources.user import UserRegisterResource
from resources.user import UserLoginResource
from resources.user import UserLogoutResource
app = Flask(__name__)
# 환경변수 셋팅
app.config.from_object(Config)
# JWT 매니저 초기화
jwt = JWTManager(app)
# 로그아웃된 토큰으로 요청하는 경우, 처리하는 함수 작성
@jwt.token_in_blocklist_loader
def check_if_token_is_revoked(jwt_header, jwt_payload):
jti = jwt_payload['jti']
return jti in jwt_blacklist
def handler(event, context) :
return serverless_wsgi.handle_request(app, event, context)
api = Api(app)
api.add_resource( UserRegisterResource, '/user/register')
api.add_resource( UserLoginResource, '/user/login')
api.add_resource( UserLogoutResource, '/user/logout')
if __name__ == '__main__' :
app.run()
user.py 만들고 임포트하기
from email_validator import EmailNotValidError, validate_email
from flask import request
from flask_jwt_extended import create_access_token, get_jwt, jwt_required
from flask_restful import Resource
from mysql.connector import Error
from mysql_connection import get_connection
from utils import check_password, hash_password
회원가입 class 만들기
class UserRegisterResource(Resource) :
def post(self) :
# 보낸 데이터 받기
data = request.get_json()
print(data)
# 회원가입 데이터가 모두 있는지 확인
if 'email' not in data or 'password' not in data :
return {"result":"fail"}, 401
if data['email'].strip() == '' or data['password'].strip() == '' :
return {"result":"fail"}, 401
print('데이터 확인 완료')
# 다 통과 이메일 확인하기
try :
validate_email(data['email'])
except EmailNotValidError as e :
return {"result":"fail"}, 401
print('이메일 확인')
# 비밀번호 길이 유효 확인
if len(data['password']) < 4 or len(data['password']) > 12 :
return {"result":"fail"}, 401
print('비밀번호 확인')
# 비밀번호 암호화
password = hash_password(data['password'])
print(password)
# DB에 회원정보 저장
try :
connection = get_connection()
query = '''
insert into user
(email, password)
values
(%s, %s);'''
recode = ( data['email'], password)
cursor = connection.cursor()
cursor.execute(query, recode)
connection.commit()
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
# 유저아이디로 토큰 생성
accessToken = create_access_token(user_id)
# 응답하기
return {"result":"seccess", "accessToken":accessToken}
포스트맨 설정하고 send하여 결과 확인하기
로그인 class 만들기
class UserLoginResource(Resource) :
def post(self) :
data = request.get_json()
print(data)
if 'email' not in data or 'password' not in data :
return {"result":"fail"}, 401
if data['email'].strip() == '' or data['password'].strip() == '' :
return {"result":"fail"}, 401
# DB에서 유저 정보 가져오기
try :
connection = get_connection()
query = '''
select *
from user
where email = %s;'''
recode = ( data['email'] , )
cursor = connection.cursor(dictionary=True)
cursor.execute(query, recode)
result_list = cursor.fetchall()
print(result_list)
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
if result_list == [] :
return {"result":"fail"}, 401
isCorrect = check_password(data['password'], result_list[0]['password'])
if isCorrect == False :
return {"result":"fail"}, 401
userId = result_list[0]['id']
accessToken = create_access_token(userId)
return {"result":"seccess", "accessToken":accessToken}
포스트맨 설정하고 send하여 결과 확인하기
로그아웃 class 만들기
jwt_blacklist = set()
class UserLogoutResource(Resource) :
@jwt_required()
def delete(self) :
jti = get_jwt()['jti']
jwt_blacklist.add(jti)
return {"result":"success"}, 200
포스트맨 설정하고 send하여 결과 확인하기
MySQL에 반영되었다.
select * from user;
'RestFul API' 카테고리의 다른 글
instargram 사진 포스팅 API (4) follow와 like 서비스 구현하기 (0) | 2024.05.31 |
---|---|
instargram 사진 포스팅 API (3) rekognition을 이용한 자동 태그 만들기 (0) | 2024.05.30 |
instargram 사진 포스팅 API (1) 기본 세팅(Setting) 하기 (0) | 2024.05.30 |
HTTP 요청을 위한 복잡한 작업을 단순화하는 requests 라이브러리 (0) | 2024.05.30 |
관련 키워드가 포함된 뉴스 검색 API 만들기 (0) | 2024.05.29 |