[FastAPI] 비밀번호 해싱 구현하기

도톨이·2024년 4월 3일

FastAPI

목록 보기
16/17
post-thumbnail

현재 인증 로직을 담당하는 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를 입력하고 실행을 눌러보면,

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

profile
Kotlin, Flutter, AI | Computer Science

0개의 댓글