Да, можно записать токены в базу данных через middleware в FastAPI. Можно использовать middleware, чтобы выполнить какой-то код перед выполнением основного обработчика запроса, а также после выполнения основного обработчика.
Например, можно создать middleware, который будет вызываться после аутентификации пользователя и сохранять токен в базу данных. Для этого нужно создать функцию middleware, которая будет принимать объект запроса и функцию, обрабатывающую запрос, и внутри этой функции сохранять токен в базу данных.
Вот пример кода, который показывает, как можно сделать это:
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from fastapi.routing import APIRoute
from datetime import datetime, timedelta
def save_token_middleware(request: Request, call_next):
# Выполнение кода перед обработкой запроса
response = call_next(request)
# Выполнение кода после обработки запроса
if "access_token" in response.body:
access_token = response.json().get("access_token")
username = response.json().get("sub")
expiration_time = datetime.now() + timedelta(minutes=15)
# Здесь можно сохранить токен в базу данных
# используя модуль для работы с БД
# например, SQLAlchemy или Tortoise ORM
return response
# Создаем экземпляр приложения
app = FastAPI()
# Регистрируем middleware
app.router.route_class = APIRoute
app.middleware("http")(save_token_middleware)
# Обработчик запроса
@app.post("/users/auth", response_model=schemas.Token, tags=["users"])
def authenticate_user(user: schemas.UserAuthenticate, db: Session = Depends(get_db)):
db_user = crud.get_user_username(db, username=user.username)
if db_user is None:
raise HTTPException(status_code=403, detail="Username or password is incorrect")
else:
is_password_correct = authenti.username_password(db, user)
if is_password_correct is False:
raise HTTPException(status_code=403, detail="Username or password is incorrect")
else:
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = authenti.encode_jwt(
data={"sub": user.username}, expires_delta=access_token_expires)
return {"access_token": access_token, "token_type": "Bearer"}