FastAPI Swagger 접근 제한하기

프로필 사진mingke

FastAPI private Swagger

목차

FastAPI Swagger 접근제한

최근에 Swagger 관련 이야기를 하다가 Swagger에 접근하는 방법에 대한 이야기가 나왔습니다. 프로젝트를 하면서 API를 만들었는데 Swagger에 같은 팀원만 접근할 수 있도록 만들 필요가 있었습니다.

이번 포스팅에서 FastAPI Swagger를 아무나 접근해서 볼 수 없도록 하는 방법을 정리해보려고 합니다. 아이디와 비밀번호로 인증 후 접근하는 방법입니다. 방법은 어렵지 않습니다.

관련 코드

다음과 같은 코드를 활용하면 쉽게 가능합니다.

from typing import Annotated
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import HTTPBasicCredentials, HTTPBasic
from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html
from fastapi.openapi.utils import get_openapi
from app.router import router
 
SWAGGER_USERNAME = "admin" # 원하는대로 수정
SWAGGER_PASSWORD = "password" # 원하는대로 수정
 
app = FastAPI(
    docs_url=None,
    redoc_url=None,
    openapi_url=None,
)
app.include_router(router)
 
security = HTTPBasic()
 
def authenticate_user(credentials: Annotated[HTTPBasicCredentials, Depends(security)]):
    if (
        credentials.username != SWAGGER_USERNAME
        or credentials.password != SWAGGER_PASSWORD
    ):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect Credentials",
            headers={"WWW-Authenticate_user": "Basic"},
        )
 
@app.get("/docs", include_in_schema=False)
async def get_docs(
    credentials: Annotated[HTTPBasicCredentials, Depends(authenticate_user)],
):
    return get_swagger_ui_html(openapi_url="/openapi.json", title="Swagger UI")
 
@app.get("/redoc", include_in_schema=False)
async def get_redocs(
    credentials: Annotated[HTTPBasicCredentials, Depends(authenticate_user)],
):
    return get_redoc_html(openapi_url="/openapi.json", title="ReDoc")
 
@app.get("/openapi.json", include_in_schema=False)
async def get_open_api_endpoint(
    credentials: Annotated[HTTPBasicCredentials, Depends(authenticate_user)],
):
    return get_openapi(
        title="FastAPI with Private Swagger",
        version="0.1.0",
        routes=app.routes,
    )
 
  • docs_url, redoc_url, openapi_url 을 app에서 모두 None 으로 세팅해줍니다. 그래야 FastAPI에서 기본 설정을 사용하지 않습니다.
  • HTTPBasic 객체를 인증으로 사용하시면 username과 password를 입력받도록 변경됩니다.
  • authenticate Dependency를 만들어서 Swagger에 접근하려고 하는 사람에게 username과 password를 입력받습니다.
  • docs_url, redoc_url, openapi_urlNone으로 만들었기 때문에 각각의 endpoint를 만들어야 합니다. 아래 코드들을 제공해주기 때문에 이것들을 이용하면 됩니다.
    from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html
    from fastapi.openapi.utils import get_openapi
  • include_in_schema 속성도 중요합니다. app에 endpoint를 추가했기 때문에 include_in_schemaFalse 로 주지 않으면 Swagger에 위 3개가 API로 등장합니다. 그래서 False 로 설정합니다.
  • http://127.0.0.1:8000/docs 로 접근하면 아래와 같이 나옵니다.
    FastAPI private Swagger 접속 화면

마무리

최근에 오름캠프 파이썬 Django 백엔드 과정에서 멘토로 일하고 있어서 Django 위주로 계속보느라 오랜만에 FastAPI 글 입니다. 둘 다 좋은 프레임워크이고 특징도 다릅니다만, 저는 FastAPI가 더 재밌네요. 이상으로 FastAPI에서 Swagger 접근 제한 하는 방법에 대해서 알아봤습니다.

Loading...