Не могли бы вы сказать мне, как создать конечные точки, которые работают только после аутентификации пользователя? Мне нужны только конечные точки, расположенные под файлами линии = [] для работы таким образом. На данный момент все работает без аутентификации, хотя это не должно.
Не могли бы вы сказать мне, как создать конечные точки, которые работают только после аутентификации пользователя? Мне нужны только конечные точки, расположенные под файлами линии = [] для работы таким образом. На данный момент все работает без аутентификации, хотя это не должно.[code]import uvicorn from fastapi import FastAPI, HTTPException, Response, Depends, UploadFile from fastapi.responses import StreamingResponse, FileResponse from pydantic import BaseModel, Field from typing import Annotated, List from authx import AuthX, AuthXConfig from sqlalchemy import select from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column from passlib.context import CryptContext
# Конфигурация AuthX config = AuthXConfig() # Конфигурация AuthX config.JWT_SECRET_KEY = "kirieshki" # Секретный ключ для создания JWT-токенов config.JWT_ACCESS_COOKIE_NAME = "access_token" # Название куки-токена config.JWT_TOKEN_LOCATION = ['cookies'] # Расположение куки-токенов security = AuthX(config=config) # Обозначаем конфиг для модуля AuthX
@app.post("/register", tags=["Авторизация"], summary="Зарегистрировать аккаунт") async def register(creds: UserSchema, response: Response, session: SessionDep): "Регистрация пользователя" # Проверка на существование пользователя с таким же username check_user = select(UserModel).where(UserModel.username == creds.username) existing_user = await session.execute(check_user) if existing_user.scalar_one_or_none(): raise HTTPException(status_code=400, detail="User already exist")
# Хэширование паролей перед сохранением hashed_password = password_context.hash(creds.password)
# Регистрация нового пользователя, если уже существующй в БД username не найден new_user = UserModel(username=creds.username, password=hashed_password) # Создание нового пользователя session.add(new_user) # Добавление нового пользователя в БД await session.commit() # Сохранение данных в БД await session.refresh(new_user) # Обновление информации в БД
# Создание JWT-токена с payload access_token = security.create_access_token(uid=str(new_user.uid)) security.set_access_cookies(access_token, response)
return {"message": "User has been registered"}
@app.post("/login", tags=["Авторизация"], summary="Войти в аккаунт") async def login(creds: UserSchema, response: Response, session: SessionDep): "Вход пользователя" # Проверка на существование в БД пользователя с таким же именем и паролем check_user = select(UserModel).where(UserModel.username == creds.username) existing_user = await session.execute(check_user) user = existing_user.scalar_one_or_none()
# Проверяем, существует ли пользователь и совпадает ли хэш пароля с паролем if not user or not password_context.verify(creds.password, user.password): raise HTTPException(status_code=401, detail="Invalid username or password")
# Создание куки-токена access_token = security.create_access_token(uid=str(user.uid)) security.set_access_cookies(access_token, response)
return {"Success": True}
@app.post("/reset", tags=["Работа с БД"], summary="Сброс БД") async def reset_database(): "Сброс БД" async with engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) await conn.run_sync(Base.metadata.create_all) return {"База данных успешно сброшена": True}
files = [] # Список файлов, загружаемых на сервер
@app.get("/get_filenames", tags=["Получение файлов"], summary="Получить названия файлов") async def get_filenames(): if len(files) == 0: # Проверка на наличие загруженных файлов return {"File list is empty"} else: return files
def iterfile(filename: str): # Обработчик файлов. Нарезает файлы на чанки для постепенной загрузки "Обработка файлов / нарезка на чанки" with open(filename, "rb") as file: while chunk := file.read(1024 * 1024): yield chunk
@app.post("/upload", tags=["Добавление файлов"], summary="Загрузка файла") async def upload_file(uploaded_file: UploadFile): "Загрузка файла" file = uploaded_file.file filename = uploaded_file.filename with open(f"1_{filename}", "wb") as f: f.write(file.read()) files.append(f"1_{filename}") return {"File was uploaded": True}
@app.post("/upload_multiple", tags=["Добавление файлов"], summary="Загрузка нескольких файлов") async def upload_files(uploaded_files: list[UploadFile]): for uploaded_file in upload_files: file = uploaded_file.file filename = uploaded_file.filename with open(f"1_{filename}", "wb") as f: f.write(file.read()) files.append(f"1_{filename}") return {"Multiple files were uploaded": True}
if __name__ == "__main__": uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True) [/code] Я попытался настроить аутентификацию с помощью модуля Authx, но это не сработало.
У меня есть ASP.NET Core с cors, инициализированным следующим образом:
private const string AllowLocalApp = _myAllowLocalApp ;
string[] corsEnabledOrigins = configuration.GetSection( CORSEnabled ).Get();
Я хочу создать конечную точку, которая будет получать список строк, которые будут вызываться и использоваться как активы в функции конечной точки. Конечная точка работает правильно. Отладка. Я проверил, что функция входит и отлично выполняет....
Я хочу создать конечную точку, которая будет получать список строк, которые будут вызываться и использоваться как активы в функции конечной точки. Конечная точка работает правильно. Отладка. Я проверил, что функция входит и отлично выполняет....
Я хочу реализовать базовую аутентификацию по ключу API для всех конечных точек моего приложения FastAPI, за исключением / и /health.
Я собирался это сделать с использованием промежуточного программного обеспечения, например
@app.middleware( http )...
В моем приложении API .net core я использовал DTO для получения данных. У меня было несколько классов DTO для различных конечных точек API.
Мне нужно использовать общий подход DTO или общий формат JSON для различных конечных точек API. Поэтому я...