회원가입 API에서 토큰 생성해서 처리하는 코드 작성
from email_validator import EmailNotValidError, validate_email
# 이메일 주소가 올바른지 확인하기 위한 라이브러리
from flask import request
from flask_jwt_extended import create_access_token
from flask_restful import Resource
from mysql_connection import get_connection
from mysql.connector import Error
from utils import check_password, hash_password
class UserRegisterResource(Resource):
def post(self):
# 1. 클라이언트가 보낸 데이터를 받아준다.
data = request.get_json()
print(data)
# 2. 데이터가 모두 있는지 확인한다.
if 'email' not in data or 'username' not in data or 'password' not in data:
return {"result" : "fail"}, 400
if data['email'].strip() == '' or data['username'].strip() == '' or data['password'].strip() == '':
return {"result" : "fail"}, 400
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. 비밀번호 길이가 유효한지 확인한다. ex) 비번은 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"}, 500
# 6-2. user_id 를 바로 클라이언트에게 보내지 않고
## JWT 로 암호화해서 인증토큰을 보내야 한다.
access_token = create_access_token(user_id)
# 7. 응답할 데이터를 JSON 으로 만들어서 리턴
return {"result":"success", "access_token" : access_token}
포스트맨에서 암호화된 인증토큰이 나오는지 테스트
회원가입한 회원일때 비밀번호가 일치하면 로그인을 되도록 코드 작성
class UserLoginResource(Resource):
def post(self):
# 1. 클라이언트로부터 데이터를 받는다.
data = request.get_json()
if 'email' not in data or 'password' not in data:
return {"result" : "fail"}, 400
if data['email'].strip() == '' or data['password'].strip() == '':
return {"result" : "fail"}, 400
# 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()
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
# 3. 회원인지 확인한다.
if result_list == []:
return {"result" : "fail"}, 401
# 4. 비밀번호를 체크한다.
# 유저가 입력한 비밀번호 data['password']
# DB에 암호화된 비밀번호 result_list[0]['password']
isCorrect = check_password(data['password'], result_list[0]['password'])
if isCorrect == False:
return {"result" : "fail"}, 401
# 5. 유저아이디를 가져온다.
user_id = result_list[0]['id']
# 6. JWT 토큰을 만든다.
access_token = create_access_token(user_id)
# 7. 클라이언트에 응답한다.
return {"result" : "success", "access_token" : access_token}
포스트맨에서 테스트
'Restful API' 카테고리의 다른 글
[Restful API] 토큰 유효기간 만료 시키기 (0) | 2024.05.22 |
---|---|
[Restful API] 로그인한 유저만 처리할 수 있는 API에 토큰 적용하는 방법 (0) | 2024.05.22 |
[Restful API] Flask 에서 JWT 설치 및 설정하는 방법 (0) | 2024.05.22 |
[Restful API] Python MySQL Connector delete (0) | 2024.05.21 |
[Restful API] Python MySQL Connector update (0) | 2024.05.21 |