Python으로 로그인 구현하기 (JWT X FastAPI)



안녕하세요. 사실 시리즈로 연재를 하고 있는데, 잘 따라오고 계신지 모르겠습니다. 회원가입과 로그인은 아주 중요한 프로젝트의 코어 기능인데, 보안과도 관련이 많아서 항상 주의를 해서 구성해야 하는 기능 입니다. 지금은 가볍게 로그인을 구현하지만, 물론 나중에 더 튼튼하고 강하게 보완할 예정입니다. 다른 편과 마찬가지로, Github에서 Commit ID 로 돌아가서 보시면 제가 이 포스트에서 사용하는 코드와 같은 코드를 보실 수 있습니다.





Commit ID : 4489dd7e12ddefdd74c8b991c209775ff055ef4d



혹시 동영상으로 보고 싶으신 분들을 위해 동영상을 첨부합니다.






1. 아주 간단한 로그인 함수

아래 로그인 함수는 아주 간단한 이메일 로그인 함수 입니다. 물론 소셜로그인은 나중에 구현할 것이고 지금은 인증만 되면 되고, 개발 후 나중에 고도화 하면 되기 때문에 이메일 인증만 지원합니다. 소셜로그인은 후편에서 만나실 수 있습니다.


@router.post("/login/{sns_type}", status_code=200)
async def login(sns_type: SnsType, user_info: models.UserRegister):
    if sns_type == SnsType.email:
        is_exist = await is_email_exist(user_info.email)
        if not user_info.email or not user_info.pw:
            return JSONResponse(status_code=400, content=dict(msg="Email and PW must be provided'"))
        if not is_exist:
            return JSONResponse(status_code=400, content=dict(msg="NO_MATCH_USER"))
        user = Users.get(email=user_info.email)
        is_verified = bcrypt.checkpw(user_info.pw.encode("utf-8"), user.pw.encode("utf-8"))
        if not is_verified:
            return JSONResponse(status_code=400, content=dict(msg="NO_MATCH_USER"))
        token = dict(
            Authorization=f"Bearer {create_access_token(data=UserToken.from_orm(user).dict(exclude={'pw', 'marketing_agree'}),)}")
        return token
    return JSONResponse(status_code=400, content=dict(msg="NOT_SUPPORTED"))


회원가입을 할때 bcrypt 라이브러리를 사용하여, 패스워드를 해시 해 주었습니다. 이번에도 마찬가지로 비밀번호를 다시 해시 하여, 패스워드를 비교합니다.




2. Swagger 에서 토큰 획득하기




http://localhost:8080/docs 에 가시면 Swagger 를 사용하실 수 있습니다. 해당 URL 로 로그인을 요청하시면 아래처럼 토큰이 발행됩니다. 앞으로 이 토큰을 가지고 우리는 개발을 할 예정입니다. 없어지면, 이렇게 다시 인증 받아서 사용하고, 어느정도 개발이 끝날때까지 이렇게 간단한 인증 시스템을 두고 개발하면 개발 속도가 올라갑니다. 이대로 출시하는 것은 절대 안되지만, 개발 중에는 편해야 하니까요!

번외로, project/app/database/schema.py 안에 BaseMixin 클래스에 쿼리 클래스메소드를 정의해 두었습니다. "아~ 이렇게 쓸수도 있구나~" 라고 생각하시면서 봐주시면 도움이 될것 입니다.



  • [[a.original_name]] ([[a.file_size | fileSizer]])
'FastAPI 프로젝트' 시리즈 포스트
Node.js 아성에 도전한다. FastAPI written in Python
2020-10-13
FastAPI 1화 - 프로젝트 생성
2020-12-18
Python FastAPI 로 백엔드 만들기 2화 - 프로젝트 구조
2020-12-21
Python FastAPI 로 백엔드 만들기 3화 - MySQL 연결
2020-12-27
파이썬에서 가장 빠른 웹프레임워크 FastAPI Feat. Pydandic
2021-01-04
Python으로 로그인 구현하기 (JWT X FastAPI)
2021-01-07
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'파이썬' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]