bcrypt의 checkpw를 통해서 encode된 password와 db에서 가져온 password를 비교해 True / False를 반환합니다.
UserService에 sign_in이라는 메소드를 만들어 줍니다.
def sign_in(self, user: UserWithPasswordModel) -> UserModel:
# select user by id
selected_user: Optional[User] = self.select_user_by_id(user.id)
if selected_user is None:
raise HTTPException(status_code=404, detail="User does not exist")
# valid passwrod
is_password_ok = selected_user.validate_password(user.password)
if not is_password_ok:
raise HTTPException(status_code=404, detail="Password incorrect")
return UserModel(**selected_user.__dict__)
User가 없을 경우 404 / password가 맞지않을 경우 404를 에러가 발생하고,
아주 간단한 회원 가입을 위해 먼저 DB -> Server -> Front 순으로 구현해봅니다.
DB 는 MariaDB 11
Server는 FastAPI
Front는 NextJS
를 사용합니다.
Python ORM 라이브러리인 sqlAlchemy 로 데이터를 조회/등록/수정/삭제합니다.
1. User Table 만들기
회원 정보는 USER_ID 와 PASSWORD 만을 가지고 있습니다.
MariaDB에 어드민 페이지를 위한 데이터베이스와 User를 만들고 권한을 부여합니다.
프로젝트 이름은 HIIO_ADMIN 으로 정했습니다.(지금)
DB NAME 은 HIIO_ADMIN USER 는 hiio420으로 생성합니다.
CREATE DATABASE HIIO_ADMIN;
CREATE USER 'hiio420'@'%' INDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON HIIO_ADMIN.* TO 'hiio420'@'%' IDENTIFIED BY '<password>';
core.py에 DB 연결을 위한 URL을 생성하고 create_engine method로 engine을 만들어 줍니다.
entity 디렉토리에는 DB entity 관련 class 들을 위치 시킵니다.base.py 에는 DeclarativeBase 상속받는 Base class를 만들고 user.py에는 Base class를 상속받는 User class를 만들어서 create_all()로 테이블을 생성해 줍니다.
User는 먼저 로그인 화면으로 진입합니다. 로그인 할 수 있는 아이디나 패스워드가 없는 경우 회원가입을 진행하고 회원가입이 정상적으로 완료되면 다시 로그인 화면으로 돌아가서 로그인을 진행 성공하면 메인 페이지로 이동하는 프로세스를 생각해 봅니다.
flowchart LR
User-->SignIn
SignIn-->|Don't Have credential|SignUp
subgraph SignUp Process
SignUp --->|Fail| Alert1[Alert SignIn fail]
end
subgraph SignIn Process
SignIn ===>|Success| Main
SignIn--->|Fail| Alert2[Alert SignIn fail]
end
SignUp ===>|success| SignIn