auth.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. """Authentication related API routes."""
  2. from typing import Any, Dict
  3. from fastapi import APIRouter, Depends, HTTPException, status
  4. from fastapi.security import HTTPAuthorizationCredentials
  5. from chatfast.services.auth import (
  6. AUTH_SCHEME,
  7. LoginRequest,
  8. RegisterRequest,
  9. UserInfo,
  10. create_auth_token,
  11. get_current_user,
  12. login_user,
  13. register_user,
  14. resolve_token,
  15. revoke_token,
  16. )
  17. router = APIRouter(prefix="/api/auth", tags=["auth"])
  18. @router.post("/register")
  19. async def api_register(payload: RegisterRequest) -> Dict[str, Any]:
  20. user = await register_user(payload.username, payload.password)
  21. token_data = await create_auth_token(user["id"])
  22. return {"user": user, "token": token_data["token"], "expires_at": token_data["expires_at"]}
  23. @router.post("/login")
  24. async def api_login(payload: LoginRequest) -> Dict[str, Any]:
  25. user = await login_user(payload.username, payload.password)
  26. token_data = await create_auth_token(user["id"])
  27. return {"user": user, "token": token_data["token"], "expires_at": token_data["expires_at"]}
  28. @router.post("/logout")
  29. async def api_logout(
  30. credentials: HTTPAuthorizationCredentials = Depends(AUTH_SCHEME),
  31. ) -> Dict[str, str]:
  32. if not credentials:
  33. raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="未登录")
  34. user = await resolve_token(credentials.credentials)
  35. if not user:
  36. raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="登录已失效")
  37. await revoke_token(credentials.credentials)
  38. return {"status": "ok"}
  39. @router.get("/me")
  40. async def api_me(current_user: UserInfo = Depends(get_current_user)) -> UserInfo:
  41. return current_user