개발/백엔드
server - 회원가입( 비밀번호 암호화(psycopg2) 와 jwt 토큰 설치, email 확인을 위한 email-validator )
웅'jk
2023. 1. 5. 11:17
서버에서 user 테이블을 생성하고 username , email , password 로 만들겠습니다.
create table user(
id int primary key not null unsiged auto_increment,
username varchar(80) not null unique,
email varchar(200) not null unique,
password varchar(256)
)
클라이언트에서 POST 방식으로 회원가입을 진행하기 위해 데이터를 보내왔습니다.
{ "name": "홍길동",
"email":"abc@naver.com",
"password":"1234" }
이를 처리하는 코드를 작성합니다.
0. 필요한 라이브러리 임포트
import datetime
from flask import request
from flask_restful import Resource
from mysql.connector.errors import Error
from mysql_connection import get_connection
from email_validator import validate_email,EmailNotValidError
from utils import hash_password
from flask_jwt_extended import create_access_token
1. 데이터를 받아옵니다.
class UserRegisterResource(Resource) :
def post(self) :
# 1. 클라이언트가 보낸 데이터를 받아준다.
data = request.get_json()
2. 입력받은 이메일이 올바른지 처리하기 위해 validation 라이브러리를 설치하고 확인합니다.
pip install email-validator
# 2. email 주소 형식이 올바른지 확인한다.
try :
validate_email( data['email'] )
except EmailNotValidError as e :
print(str(e))
return { 'result' : 'fail' , 'error' : str(e) } , 400
3. 비밀번호의 길이를 확인합니다. ( 4자리 ~ 12자리 까지만 인정)
# 3. 비밀번호의 길이가 유효한지 체크한다.
if len( data['password'] ) > 12 or len(data['password']) < 4 :
return {'error' : '비밀번호 길이 확인'} , 400
4. 비밀번호를 암호화 하여 서버에 저장하기 위해서 utils.py 에 암호화 코드를 작성하고 호출하여 암호화를 진행합니다.
pip install psycopg2-binary
pip install passlib
# utils.py
from passlib.hash import pbkdf2_sha256
from config import Config
# 원문 비밀번호를, 암호화 하는 함수
def hash_password(original_password) :
salt = Config.SALT
password = original_password + salt
password = pbkdf2_sha256.hash(password)
return password
# 유저가 로그인할때, 입력한 비밀번호가 맞는지 체크하는 함수
def check_password(original_password , hashed_password) :
salt = Config.SALT
password = original_password + salt
check = pbkdf2_sha256.verify(password,hashed_password)
return check
# config.py 이전 포스팅에서 작성한 코드는 제외
SALT = 'dskj29jcdn12jn'
# JWT 관련 변수 세팅
JWT_SECRET_KEY ='여러분이설정'
# 뱅킹등 토큰을 종료할 필요가 있을시에는 TRUE
JWT_ACCESS_TOKEN_EXPIRES = False
PROPAGATE_EXCEPTIONS = True
# 4. 비밀번호를 암호화 한다.
hashed_password = hash_password( data['password'] )
print(hashed_password)
5. DB에 회원 정보를 저장한다.
try :
connection = get_connection()
query = '''insert into user(username,email,password)
values(%s,%s,%s);'''
record = (data['name'] , data['email'] , hashed_password)
cursor = connection.cursor()
cursor.execute(query,record)
connection.commit()
# 5 - 1. 클라이언트에 userid 값을 주어야한다. 그래야만 id값을 통해 내 정보를 찾을 수 있다.
user_id = cursor.lastrowid
cursor.close()
connection.close()
except Error as e :
cursor.close()
connection.close()
return {'result' : 'fail' ,'error':str(e)} , 500
여기서 user_id 를 그대로 클라이언트에게 보내주게 되면 보안상의 문제가 발생하기 때문에 jwt 토큰을 이용하여
변환하여 보내주어야 한다.
pip install flask-jwt-extended
# 5 - 1 jwt 토큰
access_token = create_access_token(user_id)
return {'result' : 'success','access_token':access_token} , 200