FastAPI와 OAuth 2.0 인증 구현하기

fastapi-oauth2

FastAPI는 빠른 성능과 간결한 구문을 제공하는 파이썬 웹 프레임워크입니다. OAuth 2.0은 안전한 API 인증을 위한 널리 사용되는 프로토콜입니다. 이 블로그 게시물에서는 FastAPI와 OAuth 2.0을 사용하여 간단한 인증 구현 방법을 알아보겠습니다.

OAuth 2.0 간략 소개

OAuth 2.0은 웹 및 모바일 애플리케이션에서 안전한 인증 및 권한 부여를 위한 프로토콜입니다. OAuth 2.0은 “인증하는 서버”, “리소스 서버”, “클라이언트 애플리케이션”으로 구성됩니다. 사용자는 인증 서버에서 클라이언트 애플리케이션에 대한 권한을 부여하고, 클라이언트 애플리케이션은 리소스 서버에 접근하기 위해 인증 서버를 통해 토큰을 얻습니다.

FastAPI와 OAuth 2.0 연동 방법

  1. FastAPI 프로젝트를 생성합니다.
  2. fastapioauthlib를 설치합니다.
pip install fastapi oauthlib
  1. OAuth 2.0 인증을 위한 oauthlib.oauth2 모듈을 임포트합니다.
from oauthlib.oauth2 import BackendApplicationClient, TokenExpiredError
  1. 클라이언트 애플리케이션의 인증 서버 URL, 클라이언트 아이디 및 시크릿 키를 설정합니다.
AUTH_SERVER_URL = "https://example.com/auth"
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"
  1. FastAPI 앱 객체를 생성하고, 인증 서버와 통신하기 위한 클라이언트 객체를 초기화합니다.
app = FastAPI()
client = BackendApplicationClient(client_id=CLIENT_ID)
oauth_client = AsyncOAuth2Client(client=client)
  1. FastAPI 엔드포인트에 인증 데코레이터를 추가하여 인증 여부를 확인합니다.
@app.get("/protected_resource")
async def protected_resource(token: str = Depends(oauth2_scheme)):
    try:
        token = oauth_client.parse_request_body_response(token=token)
        if token.get("expires_in"):
            expired = datetime.utcnow() > datetime.fromtimestamp(token["expires_in"])
            if expired:
                raise TokenExpiredError()
    except TokenExpiredError:
        # 인증 토큰이 만료된 경우 처리하는 코드
        return {"error": "Token expired"}
    else:
        # 보호된 리소스에 대한 처리 로직
        return {"data": "Protected resource"}

  1. FastAPI 앱을 실행합니다.
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

이제 FastAPI와 OAuth 2.0을 연동하여 안전하고 보호된 API 인증을 구현할 수 있습니다. OAuth 2.0은 다양한 인증 프로토콜 중 하나로 널리 사용되며, FastAPI의 간결한 문법과 높은 성능을 결합하여 효율적인 웹 애플리케이션 개발을 가능하게 합니다.

#FastAPI #OAuth2