간단한 기본 게시판 CRUD api에 이어 일반 회원가입, 로그인 처리를 진행해보겠다.
이전글
➡️ 기본 게시판 CRUD API 구현 실습
2023.07.28 - [Python/FastAPI] - [FastAPI ①]게시판 CRUD API 구현 실습 (SQLAlchemy / Rest API / 예외 처리)
또 Spring security JWT 로그인 실습에 대한 내용이 궁금하신 분들은 참고하세요
➡️ Spring security JWT 로그인
1. 테이블 생성 및 도메인 생성
일단 회원 테이블이 필요하다.
Users라는 이름의 회원 정보를 담아줄 클래스를 만들었다.
models.py
서버 재 실행 후 테이블이 잘 생성 됐는지 확인한다.
# 생성된 테이블 리스트 출력
.tables
# 생성된 테이블 컬럼 정보 출력
SELECT sql FROM sqlite_master WHERE tbl_name='테이블명';
2. 라우터 설정
user_router.py
해당 라우터를 main.py 에도 추가해줬다.
main.py
확인해보니 잘 생성되었다.
이로써 일단 준비는 완료했다.
다음 단계로 넘어가보자.
3. 회원가입 + 유효성 검사 + 비밀번호 해싱
회원가입을 위한 메서드를 생성해준다.
해당 메서드는 data form형식으로 회원 정보를 받아 처리를 해줘야 하니 일단 스키마를 만들어줬다.
user_router.py
user_schema.py
이대로 진행해도 되지만 우리는 유효성 검증을 해주고 싶다.
1. email, name, phone, pw를 모두 빠짐없이 받아야 한다.
2. email이 email 형식이어야 한다.
3. phone의 형식은 000-0000-0000 이어야 한다.
4. 비밀번호는 8자 이상 영문과 숫자를 포함해야 한다.
그럼 이렇게
email의 타입을 EmailStr로 바꿔주고 @Validator를 추가해줘서 유효성 검증을 진행할 수 있다.
한번 직접 실행해본다.
항목을 빠뜨린 경우도...
phone형식이 맞지 않는 경우도
비밀번호 형식이 맞지 않는 경우도
email 형식이 맞지 않는 경우도
체크하고 넘어갈 수 있다.
올바른 형식으로 넘길 경우
모든 유효성 검증에 통과해 상태값 200을 응답받은 걸 볼 수 있다.
그럼 일단 전달받은 형식을 통해 회원가입을 진행해본다.
user_router.py
일단 이미 존재하는지부터 확인을 해야한다.
존재하면 409에러를, 존재하지 않으면 회원가입을 진행한다.
user_crud.py
비밀번호를 그대로 저장하지 않고 해싱해서 저장해야하기 때문에
패키지를 추가해줬다.
poetry add passlib
poetry add bcrypt
한번 실행해본다.
200 응답을 받았고
실제 테이블에도 저장된 걸 볼 수 있다.
한번 더 요청보내보면 이미 존재하는 회원이기에 409 에러를 뱉는 걸 볼 수 있다.
5. 로그인
일단 일반 로그인은 사용자가 본인의 이메일, 비밀번호를 입력하면 해당 이메일, 그리고 해싱된 비밀번호를 매치해 맞는지 여부를 봐야한다.
user_router.py
일단 로그인할 때 받아줄 폼을 fastapi에서 제공하는 Security 에서 OAuth2PasswordRequestForm을 사용한다.
해당 폼을 사용하기 위해선 필요한게 python-multipart 이다
poetry add python-multipart
설치해준다.
일단 로그인을 하면 해당 회원이 존재하는지 확인을 해야한다. 아까 만들어둔 get_user을 재 사용해준다.
그리고 그 결과를 확인해 아까와는 반대로 회원이 존재하지 않으면 400 에러를 뱉는다.
그리고 회원이 존재하면 로그인을 진행하는데
이미 회원이 있는 걸 아니 이메일 확인은 필요없이 바로 회원이 입력한 비밀번호와 DB에 저장된 해싱된 비밀번호가 같은지 여부를 확인한다.
user_crud.py
암호를 복호화해준다.
그리고 그 결과가 true 면 로그인 성공인 200을, false면 400 에러를 뱉어준다.
확인해보면
로그인 성공!
비밀번호를 다르게 써서 전달해보면 400 에러가 뜬다.
아주 간단한 수준의 로그인은 구현됐다.
하지만 실제로 쓰긴 어렵다.
다음 단계는 JWT 로그인으로...
코드
https://github.com/recordbuffer/TIL/tree/main/FastAPI
참고
https://fastapi.tiangolo.com/ko/tutorial/security/
'Python > FastAPI' 카테고리의 다른 글
[FastAPI] OAuth2.0 소셜 로그인 회원가입 구현 SPA (구글 로그인 / 네이버 로그인 / 카카오 로그인) (1) | 2024.09.17 |
---|---|
[FastAPI ③] JWT 로그인 구현 실습 (Rest API / Bearer with JWT tokens / 쿠키에 토큰 저장) (2) | 2023.09.13 |
[FastAPI ①]게시판 CRUD API 구현 실습 (SQLAlchemy / Rest API / 예외 처리) (0) | 2023.07.28 |
[FastAPI] 파이썬 경량 프레임워크 (기본 개념 / 입문 / 개발 환경 구성) (0) | 2023.06.06 |
댓글