전체코드
import datetime
from http import HTTPStatus
from flask import request
from flask_jwt_extended import create_access_token
from flask_restful import Resource
from mysql.connector.errors import Error
from mysql_connection import get_connection
import mysql.connector
from email_validator import validate_email, EmailNotValidError
from utils import check_password, hash_password
class UserRegisterResource(Resource):
def post(self):
# {
# "username":"홍길동"
# "email": "abc@naver.com",
# "password": "1234"
# }
# 1. 클라이언트가 body에 보내준 json을 받아온다.
data = request.get_json()
# 2. 이메일 주소형식이 제대로 된 주소형식인지
# 확인하는 코드 작성.
try:
validate_email(data['email'])
except EmailNotValidError as 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'])
# 5. 데이터베이스에 회원정보를 저장한다!!
try:
# 데이터 업데이트
# 1. DB에 연결
connection = get_connection()
# 2. 쿼리문 만들기
query = '''insert into user
(username, email, password)
values
(%s, %s, %s);'''
record = (data['username'], data['email'], hashed_password )
# 3. 커서를 가져온다.
cursor = connection.cursor()
# 4. 쿼리문을 커서를 이용해서 실행한다.
cursor.execute(query, record)
# 5. 커넥션을 커밋해줘야 한다 => 디비에 영구적으로 반영하라는 뜻
connection.commit()
# 5-1. 디비에 저장된 아이디값 가져오기
user_id = cursor.lastrowid
# 6. 자원 해제
cursor.close()
connection.close()
except mysql.connector.Error as e:
print(e)
cursor.close()
connection.close()
return {'error':str(e)}, 503
# user_id 를 바로 보내면 안되고,
# JWT로 암호화 해서 보내준다.
# 암호화 하는 방법
access_token = create_access_token(user_id, expires_delta = datetime.timedelta(minutes = 1))
return {'result': 'success', 'access_token': access_token}, 200
class UserLoginResource(Resource):
def post(self):
# {
# "email": "abc@naver.com",
# "password": "1234"
# }
# 1. 클라이언트가 body에 보내준 json을 받아온다.
data = request.get_json()
try:
# 1. DB에 연결
connection = get_connection()
# 2. 쿼리문 만들기
query = '''select *
from user
where email = (%s);'''
record = (data['email'], )
# 3. 커서를 가져온다.
cursor = connection.cursor()
# 4. 쿼리문을 커서를 이용해서 실행한다.
cursor = connection.cursor(dictionary = True)
cursor.execute(query, record)
# 4-1 select id를 가져온다
result_list = cursor.fetchall()
i = 0
for record in result_list :
result_list[i]['created_at'] = record['created_at'].isoformat()
result_list[i]['updated_at'] = record['updated_at'].isoformat()
i = i + 1
# 5. 커넥션을 커밋해줘야 한다 => 디비에 영구적으로 반영하라는 뜻
connection.commit()
# 6. 자원 해제
cursor.close()
connection.close()
# result_list의 행의 갯수가 1개이면,
# 유저 데이터를 정상적으로 받아온것이고,
# 행의 갯수가 0이면, 요청한 이메일은, 회원가입이
# 되어 있지 않은 이메일이다.
if len(result_list) != 1:
return {'error': '회원가입이 안된 이메일입니다.'}, 400
# 4. 비밀번호가 맞는지 확인한다.
user_info = result_list[0]
# data['password'] 와 user_info['password']를 비교
check = check_password(data['password'], user_info['password'])
if check == False:
return {'error': '비밀번호가 맞지 않습니다.'}, 400
except mysql.connector.Error as e:
print(e)
cursor.close()
connection.close()
return {'error':str(e)}, 503
access_token = create_access_token(user_info['id'], expires_delta = datetime.timedelta(minutes = 1))
return {'result': 'success', 'access_token ': access_token }, 200
user_id를 바로 보내지 않고, JWT로 암호화 해서 보내준다.
'REST API' 카테고리의 다른 글
Flask 토큰 유효기간 만료 시키는 방법 (0) | 2022.06.20 |
---|---|
Flask에서 로그인한 유저만 처리할 수 있는 API에 토큰 적용하는 방법 (0) | 2022.06.20 |
Flask에서 JWT 설치방법 (0) | 2022.06.20 |
포스트맨 사용법 (0) | 2022.06.17 |
python MySQL Connector를 이용해 insert, select, update, delete 하는 방법 (0) | 2022.06.17 |