앱을 개발할때 개발자가 사용자들의 비밀번호를 알수없도록 암호화만 가능하게 만들어야 한다. (단방향)
이때 암호화만 하되 복호화는 하지않는것이 hash다.
먼저 사용할 psycopg2-binary와 passlib라이브러리를 설치하자.
pip install psycopg2-binary passlib
비밀번호 암호화를 위한 파이썬 파일을 만들어 코드를 작성한다.
from passlib.hash import pbkdf2_sha256
# 원문 비밀번호를 암호화 하는 함수 (암호화만 하되 복호화는 하지않는것이 해쉬다.)
def hash_password(original_password) :
salt = 'yh*hello12'
password = original_password + salt
password = pbkdf2_sha256.hash(password)
return password
# 비밀번호가 맞는지 확인하는 함수, True / False로 리턴한다.
def check_password(original_password, hashed_password):
salt = 'yh*hello12'
check = pbkdf2_sha256.verify(original_password+salt,hashed_password)
return check
# salt로 문자를 임의로 정해서 유니크한 암호기를 만든다.
회원가입하는 API를 만들어보자.
이메일 형식을 체크하는 라이브러리인 email-validator를 설치하자
pip install email-validator
관련 웹사이트:
https://pypi.org/project/email-validator/
email-validator
A robust email syntax and deliverability validation library.
pypi.org
유저 정보를 처리하기 위한 파이썬 파일을 만들고 코드를 입력하자
from http import HTTPStatus
from flask import request
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 hash_password, check_password
class UserRegisterResource(Resource):
def post(self):
data = request.get_json()
# 이메일 주소형식을 확인한다.
try:
validate_email(data['email'])
except EmailNotValidError as e:
print(str(e))
return {'error' : str(e)} , 400
# 비밀번호 암호화
# 비밀번호의 길이가 유효한지 체크한다. 4자리이상 12자리이상
if len(data['password']) < 4 or len(data['password'])>12:
return{'error': '비밀번호 길이는 4자리 이상 12자리 이하이어야 합니다.'}, 400
hashed_password = hash_password(data['password'])
# 데이터베이스에 회원정보를 저장한다.
try :
# 데이터 insert
# 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()
# DB에 저장된 ID값 가져오기
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 #
return {"result":"success" , "user_id" : user_id}, 200
# 유저아이디로 유저를 특정할수있도록 설정한다.
테이블에 유저정보가 저장된것을 확인할수있다.
'백엔드 > API' 카테고리의 다른 글
[API] AWS IAM 사용자 설정 (0) | 2022.06.23 |
---|---|
[API] 인증토큰 JWT, 로그인과 로그아웃: JWTManager, create_access_token, token_in_blocklist_loader (0) | 2022.06.20 |
[API] 로그인 API: check_password (0) | 2022.06.20 |
[API] 파이썬에서 MySQL 연결 후 Restful API 생성 (0) | 2022.06.17 |
[API] API(Application Programming Interface)와 postman (0) | 2022.06.17 |
댓글