[python] FastAPI에서 OAuth2 인증 구현하기

인증은 웹 애플리케이션에서 사용자의 신원을 확인하고 보호된 리소스에 접근을 제한하는 중요한 부분입니다. FastAPI는 OAuth2 인증을 구현하기 위해 fastapi.security 모듈을 제공합니다. 이 모듈을 사용하면 간단하게 OAuth2 서비스를 통해 사용자를 인증하고 액세스 토큰을 발급받을 수 있습니다.

1. 의존성 설치하기

OAuth2 인증을 사용하기 위해 fastapi 외에도 몇 가지 패키지가 필요합니다. 다음 명령을 사용하여 필요한 패키지를 설치하세요.

pip install python-jose[cryptography] python-multipart requests_oauthlib

2. 프로바이더 설정하기

from fastapi import FastAPI
from fastapi.security import OAuth2PasswordBearer
from fastapi.security.oauth2 import OAuth2PasswordRequestForm

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

OAuth2PasswordBearer 클래스를 사용하여 OAuth2 액세스 토큰을 검증하는 방법을 설정합니다. tokenUrl 매개변수에는 토큰을 발급 받을 엔드포인트의 경로를 지정합니다.

3. 인증 경로 만들기

@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    user = authenticate_user(form_data.username, form_data.password)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect username or password",
            headers={"WWW-Authenticate": "Bearer"},
        )
    access_token = create_access_token(data={"sub": user.username})
    return {"access_token": access_token, "token_type": "bearer"}

위의 코드는 /token 경로에서 사용자를 인증하고 액세스 토큰을 발행하는 엔드포인트입니다. OAuth2PasswordRequestForm 클래스를 사용하여 사용자명과 비밀번호를 받습니다. authenticate_user 함수를 호출하여 사용자를 인증하고, 인증에 실패한 경우 HTTPException을 발생시킵니다. 인증에 성공하면 create_access_token 함수를 사용하여 액세스 토큰을 발급합니다.

4. 보호된 엔드포인트 만들기

from fastapi import Depends, HTTPException, status

@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):
    user = get_user_from_token(token)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid authentication token",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return {"message": "Hello, authenticated user!"}

위의 코드는 /protected 경로로 접근할 때 액세스 토큰을 검증하는 엔드포인트입니다. Depends(oauth2_scheme) 매개변수를 사용하여 액세스 토큰을 인증하고, 인증에 실패한 경우 HTTPException을 발생시킵니다. 인증에 성공했다면 인증된 사용자에게 인사하는 메시지를 반환합니다.

결론

FastAPI의 fastapi.security 모듈을 사용하면 간단하게 OAuth2 인증을 구현할 수 있습니다. 이를 통해 보안성을 향상시키고, 사용자의 신원을 확인하여 보호된 리소스에 접근을 제한할 수 있습니다.

더 많은 정보를 원하시면 FastAPI 공식 문서를 참조하십시오.