50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
import os
|
||
import httpx
|
||
import flet as ft
|
||
|
||
API_URL = os.getenv("API_URL", "http://api:8000")
|
||
_TOKEN_KEY = "auth_token"
|
||
|
||
|
||
class AuthService:
|
||
"""Сервис авторизации: логин, логаут, проверка токена."""
|
||
|
||
def __init__(self, page: ft.Page):
|
||
self._page = page
|
||
|
||
async def login(self, username: str, password: str) -> str | None:
|
||
"""
|
||
Отправляет запрос на POST /auth/login.
|
||
Возвращает None при успехе, строку с ошибкой при неудаче.
|
||
"""
|
||
try:
|
||
async with httpx.AsyncClient(base_url=API_URL, timeout=10) as client:
|
||
resp = await client.post(
|
||
"/auth/login",
|
||
data={"username": username, "password": password},
|
||
)
|
||
if resp.status_code == 200:
|
||
token = resp.json()["access_token"]
|
||
self._page.session.set(_TOKEN_KEY, token)
|
||
return None
|
||
elif resp.status_code == 401:
|
||
return "Неверный логин или пароль"
|
||
else:
|
||
return f"Ошибка сервера: {resp.status_code}"
|
||
except httpx.ConnectError:
|
||
return "Не удалось подключиться к серверу"
|
||
except Exception as e:
|
||
return f"Ошибка: {e}"
|
||
|
||
async def logout(self):
|
||
"""Удаляет токен — пользователь разлогинен."""
|
||
self._page.session.remove(_TOKEN_KEY)
|
||
|
||
async def get_token(self) -> str | None:
|
||
"""Возвращает сохранённый токен или None если не авторизован."""
|
||
return self._page.session.get(_TOKEN_KEY)
|
||
|
||
async def is_authenticated(self) -> bool:
|
||
token = await self.get_token()
|
||
return token is not None and token != ""
|