Вход в хоккейную панель
Используйте действующий аккаунт WFL. После входа откроется рабочий интерфейс хоккея.
{message_html}{error_html}from __future__ import annotations import html import os from urllib.parse import parse_qs from fastapi import APIRouter, HTTPException, Request from fastapi.responses import HTMLResponse, RedirectResponse from .auth_bridge import HOCKEY_COOKIE_NAME, HOCKEY_SESSION_SECONDS, HockeyAuthDependencies def create_hockey_auth_router(auth: HockeyAuthDependencies) -> APIRouter: router = APIRouter(tags=["Hockey authentication"]) @router.get("/login", response_class=HTMLResponse, include_in_schema=False) async def login_page(request: Request, reason: str = ""): if await auth.optional_user(request): return RedirectResponse("/", status_code=303) messages = { "expired": "Сессия завершена. Войдите снова.", "logout": "Вы вышли из хоккейной панели.", } return _login_response(message=messages.get(reason, "")) @router.post("/login", response_class=HTMLResponse, include_in_schema=False) async def login_submit(request: Request): try: content_length = int(request.headers.get("content-length", "0") or 0) except ValueError: content_length = 16_385 if content_length > 16_384: return _login_response(error="Слишком большой запрос.", status_code=413) values = parse_qs((await request.body()).decode("utf-8", errors="replace")) username = (values.get("username") or [""])[0] password = (values.get("password") or [""])[0] try: result = auth.adapter.login(username, password) except HTTPException as error: return _login_response( error=str(error.detail), username=username, status_code=error.status_code, ) if result is None: return _login_response( error="Неверный логин или пароль.", username=username, status_code=401, ) token, _user = result response = RedirectResponse("/", status_code=303) secure_setting = os.getenv("HOCKEY_COOKIE_SECURE", "").strip().lower() secure = ( secure_setting in {"1", "true", "yes", "on"} if secure_setting else request.url.scheme == "https" ) response.set_cookie( HOCKEY_COOKIE_NAME, token, httponly=True, secure=secure, samesite="lax", max_age=HOCKEY_SESSION_SECONDS, path="/", ) return response @router.post("/logout", include_in_schema=False) async def logout(request: Request): auth.adapter.logout(request.cookies.get(HOCKEY_COOKIE_NAME, "")) response = RedirectResponse("/login?reason=logout", status_code=303) response.delete_cookie(HOCKEY_COOKIE_NAME, path="/") return response return router def _login_response( *, error: str = "", message: str = "", username: str = "", status_code: int = 200, ) -> HTMLResponse: error_html = f'
Используйте действующий аккаунт WFL. После входа откроется рабочий интерфейс хоккея.
{message_html}{error_html}