Мінімальний приклад FastAPI з HTTP basic auth

Приклад використання імені користувача та пароля з Python

server.py
#!/usr/bin/env python3
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials
import secrets

app = FastAPI()
security = HTTPBasic()

# Демонстраційні облікові дані — у продакшені використовуйте безпечне сховище
USERNAME = "admin"
PASSWORD = "secret"

def verify_credentials(credentials: HTTPBasicCredentials = Depends(security)):
    correct_username = secrets.compare_digest(credentials.username, USERNAME)
    correct_password = secrets.compare_digest(credentials.password, PASSWORD)

    if not (correct_username and correct_password):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Невірні облікові дані",
            headers={"WWW-Authenticate": "Basic"},
        )
    return credentials

@app.get("/")
async def read_root(credentials: HTTPBasicCredentials = Depends(verify_credentials)):
    return {"message": f"Привіт, {credentials.username}!"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

Приклад використання pydantic settings для читання імені користувача та пароля зі змінних середовища

server_env.py
#!/usr/bin/env python3
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials
from pydantic_settings import BaseSettings
import secrets

class AppSettings(BaseSettings):
    HTTP_AUTH_USERNAME: str
    HTTP_AUTH_PASSWORD: str

    class Config:
        env_file = ".env"

app = FastAPI()
security = HTTPBasic()
settings = AppSettings()

def verify_credentials(credentials: HTTPBasicCredentials = Depends(security)):
    correct_username = secrets.compare_digest(credentials.username, settings.HTTP_AUTH_USERNAME)
    correct_password = secrets.compare_digest(credentials.password, settings.HTTP_AUTH_PASSWORD)

    if not (correct_username and correct_password):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Невірні облікові дані",
            headers={"WWW-Authenticate": "Basic"},
        )
    return credentials

@app.get("/list")
async def read_root(credentials: HTTPBasicCredentials = Depends(verify_credentials)):
    return {"message": f"Привіт, {credentials.username}!"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

Використовуйте так:

run_server.sh
HTTP_AUTH_USERNAME=admin HTTP_AUTH_PASSWORD=123 python3 server.py

Дивіться схожі статті за категоріями: Python