Инициализировать репозиторий «Дейл»
Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ, инструкция пользователя, техдокументация, код-стайл), бэклог, скрипты развёртывания и архив прототипа LeadRadar.
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
"""Вход в дашборд и сессии (п.4.1 ТЗ)."""
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, Response
|
||||
from pydantic import BaseModel
|
||||
|
||||
from ..auth import (
|
||||
change_password,
|
||||
create_session,
|
||||
current_login,
|
||||
destroy_session,
|
||||
ensure_creds,
|
||||
set_session_cookie,
|
||||
verify_password,
|
||||
)
|
||||
from ..config import COOKIE_NAME
|
||||
|
||||
router = APIRouter(prefix="/api", tags=["auth"])
|
||||
|
||||
|
||||
class LoginBody(BaseModel):
|
||||
login: str
|
||||
password: str
|
||||
|
||||
|
||||
class PasswordBody(BaseModel):
|
||||
oldPassword: str
|
||||
newPassword: str
|
||||
|
||||
|
||||
@router.post("/auth/login")
|
||||
def login(body: LoginBody, response: Response) -> dict:
|
||||
ensure_creds()
|
||||
login_name = body.login.strip()
|
||||
if not verify_password(login_name, body.password):
|
||||
raise HTTPException(401, "Неверный логин или пароль")
|
||||
token = create_session(login_name)
|
||||
set_session_cookie(response, token)
|
||||
return {"ok": True, "login": login_name}
|
||||
|
||||
|
||||
@router.post("/auth/logout")
|
||||
def logout(request: Request, response: Response) -> dict:
|
||||
token = request.cookies.get(COOKIE_NAME)
|
||||
destroy_session(token)
|
||||
response.delete_cookie(COOKIE_NAME)
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@router.get("/auth/me")
|
||||
def me(login: str = Depends(current_login)) -> dict:
|
||||
return {"login": login, "ok": True}
|
||||
|
||||
|
||||
@router.post("/auth/change-password")
|
||||
def change(body: PasswordBody, request: Request, response: Response, login: str = Depends(current_login)) -> dict:
|
||||
token = request.cookies.get(COOKIE_NAME)
|
||||
ok = change_password(login, body.oldPassword, body.newPassword)
|
||||
if not ok:
|
||||
raise HTTPException(400, "Текущий пароль неверен")
|
||||
# старые сессии удалены внутри change_password; выдаём свежую
|
||||
fresh = create_session(login)
|
||||
destroy_session(token)
|
||||
set_session_cookie(response, fresh)
|
||||
return {"ok": True}
|
||||
Reference in New Issue
Block a user