@Lerts

Как записать токены в бд через Middleware в fastapi?

У меня есть аутендификация и я бы хотел записывать токен с окончанием времени действия в базу двнных, можно ли это сделать через 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:
            from datetime import timedelta
            access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
            access_token = authenti.encode_jwt(
                data={"sub": user.username}, expires_delta=access_token_expires)

  ---->   print(access_token, user.username, datetime.datetime.now() + timedelta(minutes=15))
            return {"access_token": access_token, "token_type": "Bearer"}
  • Вопрос задан
  • 448 просмотров
Пригласить эксперта
Ответы на вопрос 1
gnifajio
@gnifajio
Совершенствуюсь каждый день
Да, можно записать токены в базу данных через 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"}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы