設定密碼保護你的 FastAPI Docs|抬升 Raise

2021/03/05閱讀時間約 4 分鐘
這篇文章要教你如何透過權限控管,保護 FastAPI 生成的 API 文件,讓使用者需要經過授權才能進去
FastAPI 是一個 Python 的後端框架,具有自動生成 API 文件頁面的特色,幫助開發者可以快速開發並測試 API。
FastAPI 自動生成的的 API 文件
圖片取自 FastAPI 文件
然而,這些文件會隨著伺服器的部署,一同被公開到網路上。如果你想要避免閒雜人等進入 API 文件,可以參考以下的步驟:

1. 關閉預設 API Docs

透過在創建 App 時加上以下變數,可以關閉預設 API 文件功能。
from fastapi import FastAPI
app = FastAPI(docs_url=None, redoc_url=None, openapi_url = None)

2. 新增 HTTP Basic Auth 帳號密碼驗證

透過下列程式,我們新增一個驗證物件供 API 使用。
只要在建立 API 時加上這個物件,就會需要經過帳號密碼驗證才能使用該 API
import secrets
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials


security = HTTPBasic()

def get_current_username(credentials: HTTPBasicCredentials = Depends(security)):
correct_username = secrets.compare_digest(credentials.username, "user")
correct_password = secrets.compare_digest(credentials.password, "password")
if not (correct_username and correct_password):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect email or password",
headers={"WWW-Authenticate": "Basic"},
)
return credentials.username

3. 成立文件後台的 API 並加上驗證機制

我們手動撰寫生成文件後台與 OpenAPI.json 的 API 並加上授權驗證
from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.openapi.utils import get_openapi

@app.get("/docs", include_in_schema=False)
async def get_documentation(username: str = Depends(get_current_username)):
return get_swagger_ui_html(openapi_url="/openapi.json", title="docs")


@app.get("/openapi.json", include_in_schema=False)
async def openapi(username: str = Depends(get_current_username)):
return get_openapi(title = "FastAPI", version="0.1.0", routes=app.routes)

4. 完成,運行服務並至 /docs 登入查看文件

如果依照上面的範例,帳號是 user,密碼是 password,請視情況更改帳號密碼,或運用環境變數、設定檔導入。
成功的話你會看到如下圖的畫面

完整程式碼

Originally published at https://tsraise.com on March 5, 2021.
    抬升 Raise
    抬升 Raise
    留言0
    查看全部
    發表第一個留言支持創作者!