현재 인증 로직을 담당하는 auth.py 파일은 다음과 같다.
여기서 우리가 할 것은 비밀번호 해싱을 구현하는 것이다.
해싱의 이유는 패스워드 암호화(Encryption)는 데이터베이스에 저장된 사용자 인증 정보를 안전하게 보관하는 데 필수적이기 때문이다.
from fastapi import APIRouter
from pydantic import BaseModel
from models import Users
router = APIRouter()
#pydantic
class CreateUserRequest(BaseModel):
username: str
email: str
first_name: str
last_name : str
password: str
role: str
@router.post("/auth")
async def create_user(create_user_request: CreateUserRequest):
create_user_model = Users(
email=create_user_request.email,
username=create_user_request.username,
first_name=create_user_request.first_name,
last_name=create_user_request.last_name,
role=create_user_request.role,
# 비밀 번호는 해싱되어야함.
hashed_password=create_user_request.password,
is_active=True
)
return create_user_model
# 인증. 라우터 패키지 안에 존재
@router.get("/auth")
async def get_user():
return {'user': 'authenticated'}
참고로 models.py 는 이렇게 구현한 상태이다.
from database import Base
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey
class Users(Base):
__tablename__= 'users'
id = Column(Integer, primary_key=True, index=True)
email = Column(String, unique=True)
username = Column(String, unique=True)
first_name = Column(String)
last_name = Column(String)
hashed_password = Column(String)
is_active = Column(Boolean, default=True)
role = Column(String)
class Todos(Base):
__tablename__ = 'todos'
id = Column(Integer, primary_key=True, index=True)
title = Column(String)
description = Column(String)
priority = Column(Integer)
complete = Column(Boolean, default=False)
owner_id = Column(Integer, ForeignKey("users.id"))
우선 해싱을 하기 위해 필요한 패키지를 설치할 것이다. passlib, bcrypt 를 설치할 것이다.
아래의 명령어를 터미널에 입력한다. (가상환경 활성화 한 후 다운하기)
pip install bcrypt
pip install passlib
이제 아래 코드를 auth.py 에 추가할 것이다.
bcrypt_context 안에서 bcrypt 의 해싱 알고리즘을 사용할 수 있다.
from passlib.context import CryptContext
bcrypt_context = CryptContext(schemes=['bcrypt'], deprecated='auto')
그리고 create_user 에서 hashed_password 부분을 패스워드를 해싱 알고리즘 사용한 거로 변경해준다.
@router.post("/auth")
async def create_user(create_user_request: CreateUserRequest):
create_user_model = Users(
email=create_user_request.email,
username=create_user_request.username,
first_name=create_user_request.first_name,
last_name=create_user_request.last_name,
role=create_user_request.role,
# 비밀 번호는 해싱되어야함.
hashed_password=bcrypt_context.hash(create_user_request.password),
is_active=True
)
return create_user_model
스웨거에서 테스트해보자. 다음처럼 비밀번호를 test1234를 입력하고 실행을 눌러보면,

아래 결과에는 해싱된 비밀번호가 나오는것으로 확인할 수 있다.
