FastAPI 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_url
를None
으로 만들었기 때문에 각각의 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_schema
를False
로 주지 않으면 Swagger에 위 3개가 API로 등장합니다. 그래서False
로 설정합니다.http://127.0.0.1:8000/docs
로 접근하면 아래와 같이 나옵니다.
마무리
최근에 오름캠프 파이썬 Django 백엔드 과정에서 멘토로 일하고 있어서 Django 위주로 계속보느라 오랜만에 FastAPI 글 입니다. 둘 다 좋은 프레임워크이고 특징도 다릅니다만, 저는 FastAPI가 더 재밌네요. 이상으로 FastAPI에서 Swagger 접근 제한 하는 방법에 대해서 알아봤습니다.
Loading...