优化鉴权系统

This commit is contained in:
2026-07-03 21:54:19 +08:00
parent 7e65fadd83
commit 98a92b83fa
11 changed files with 539 additions and 149 deletions
+60 -1
View File
@@ -4,6 +4,10 @@ from auth import CurrentUser
from schemas import (
CreateSessionRequest,
CreateSessionResponse,
LoginRequest,
LoginResponse,
RegisterRequest,
RegisterResponse,
SendMessageRequest,
SendMessageResponse,
SessionHistoryResponse,
@@ -11,6 +15,12 @@ from schemas import (
)
from service import ChatProviderError, ChatService
from storage import SessionNotFoundError, SessionStorageError
from users import (
InvalidCredentialsError,
UserStore,
UserStoreError,
UsernameExistsError,
)
router = APIRouter()
@@ -20,6 +30,55 @@ def get_chat_service(request: Request) -> ChatService:
return request.app.state.chat_service
def get_user_store(request: Request) -> UserStore:
return request.app.state.user_store
@router.post(
"/auth/register",
response_model=RegisterResponse,
status_code=status.HTTP_201_CREATED,
tags=["auth"],
)
async def register(
body: RegisterRequest,
request: Request,
) -> RegisterResponse:
store = get_user_store(request)
try:
user = await store.register(body.username, body.password)
except UsernameExistsError as exc:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail="username already exists",
) from exc
except UserStoreError as exc:
raise HTTPException(status_code=500, detail=str(exc)) from exc
return RegisterResponse(user_id=user.user_id, created_at=user.created_at)
@router.post(
"/auth/login",
response_model=LoginResponse,
tags=["auth"],
)
async def login(
body: LoginRequest,
request: Request,
) -> LoginResponse:
store = get_user_store(request)
try:
user = await store.login(body.username, body.password)
except InvalidCredentialsError as exc:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="invalid username or password",
) from exc
except UserStoreError as exc:
raise HTTPException(status_code=500, detail=str(exc)) from exc
return LoginResponse(user_id=user.user_id, api_key=user.api_key)
@router.post(
"/sessions",
response_model=CreateSessionResponse,
@@ -89,4 +148,4 @@ async def get_current_user_usage(
request: Request,
user: CurrentUser,
) -> UserUsageResponse:
return await get_chat_service(request).get_user_usage(user.user_id)
return await get_chat_service(request).get_user_usage(user.user_id)