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)