Spaces:
Sleeping
Sleeping
File size: 1,767 Bytes
fd3c8b9 e6e0df0 fd3c8b9 e6e0df0 fd3c8b9 e6e0df0 fd3c8b9 e6e0df0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
from typing import Optional
from fastapi import APIRouter, Body, Form, HTTPException
from datetime import timedelta
import common.auth as auth
router = APIRouter(prefix="/auth", tags=["Auth"])
def authenticate_user(username: str, password: str):
"""Проверяет, существует ли пользователь и правильный ли пароль."""
user = next((u for u in auth.USERS if u["username"] == username), None)
if not user or user["password"] != password:
raise HTTPException(status_code=401, detail="Неверный логин или пароль")
return user
def generate_access_token(username: str):
"""Генерирует токен для аутентифицированного пользователя."""
access_token_expires = timedelta(minutes=auth.ACCESS_TOKEN_EXPIRE_MINUTES)
return auth.create_access_token(data={"sub": username}, expires_delta=access_token_expires)
async def login_common(username: str, password: str):
"""Общий метод аутентификации."""
user = authenticate_user(username, password)
access_token = generate_access_token(user["username"])
return {"access_token": access_token, "token_type": "bearer"}
@router.post("/login", summary="Авторизация через JSON")
async def login_json(request: auth.LoginRequest = Body(...)):
"""Принимает JSON-запросы."""
return await login_common(request.username, request.password)
@router.post("/login/token", summary="Авторизация через Form-Data")
async def login_form(username: str = Form(...), password: str = Form(...)):
"""Принимает Form-Data (x-www-form-urlencoded)."""
return await login_common(username, password) |