auth.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. """
  2. Authentication API router.
  3. Provides endpoints for user registration, login, token refresh, and user info.
  4. """
  5. from fastapi import APIRouter, HTTPException, status, Request
  6. from schemas.auth import (
  7. UserRegister, UserLogin, TokenResponse,
  8. TokenRefresh, UserResponse
  9. )
  10. from services.auth_service import AuthService
  11. router = APIRouter(
  12. prefix="/api/auth",
  13. tags=["authentication"]
  14. )
  15. @router.post("/register", status_code=status.HTTP_201_CREATED)
  16. async def register(user_data: UserRegister):
  17. """
  18. Register a new user.
  19. Args:
  20. user_data: User registration data
  21. Returns:
  22. Success message with user_id
  23. Raises:
  24. HTTPException: 409 if username or email already exists
  25. HTTPException: 400 if validation fails
  26. """
  27. user = AuthService.register_user(
  28. username=user_data.username,
  29. email=user_data.email,
  30. password=user_data.password
  31. )
  32. return {
  33. "message": "用户注册成功",
  34. "user_id": user.id
  35. }
  36. @router.post("/login", response_model=TokenResponse)
  37. async def login(credentials: UserLogin):
  38. """
  39. Authenticate user and return JWT tokens.
  40. Args:
  41. credentials: User login credentials
  42. Returns:
  43. Access token, refresh token, and user info
  44. Raises:
  45. HTTPException: 401 if credentials are invalid
  46. """
  47. result = AuthService.login_user(
  48. username=credentials.username,
  49. password=credentials.password
  50. )
  51. return TokenResponse(
  52. access_token=result["access_token"],
  53. refresh_token=result["refresh_token"],
  54. user=UserResponse(**result["user"])
  55. )
  56. @router.post("/refresh", response_model=TokenResponse)
  57. async def refresh_token(token_data: TokenRefresh):
  58. """
  59. Refresh access token using refresh token.
  60. Args:
  61. token_data: Refresh token
  62. Returns:
  63. New access token and refresh token
  64. Raises:
  65. HTTPException: 401 if refresh token is invalid or expired
  66. """
  67. result = AuthService.refresh_tokens(token_data.refresh_token)
  68. return TokenResponse(
  69. access_token=result["access_token"],
  70. refresh_token=result["refresh_token"],
  71. user=UserResponse(**result["user"])
  72. )
  73. @router.get("/me", response_model=UserResponse)
  74. async def get_current_user(request: Request):
  75. """
  76. Get current authenticated user info.
  77. Args:
  78. request: FastAPI Request with user info in state
  79. Returns:
  80. Current user information
  81. Raises:
  82. HTTPException: 401 if not authenticated
  83. """
  84. user_data = getattr(request.state, "user", None)
  85. if not user_data:
  86. raise HTTPException(
  87. status_code=status.HTTP_401_UNAUTHORIZED,
  88. detail="未认证"
  89. )
  90. user = AuthService.get_current_user(user_data["id"])
  91. return UserResponse(
  92. id=user.id,
  93. username=user.username,
  94. email=user.email,
  95. role=user.role,
  96. created_at=user.created_at
  97. )