| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- """
- Authentication API router.
- Provides endpoints for user registration, login, token refresh, and user info.
- """
- from fastapi import APIRouter, HTTPException, status, Request
- from schemas.auth import (
- UserRegister, UserLogin, TokenResponse,
- TokenRefresh, UserResponse
- )
- from services.auth_service import AuthService
- router = APIRouter(
- prefix="/api/auth",
- tags=["authentication"]
- )
- @router.post("/register", status_code=status.HTTP_201_CREATED)
- async def register(user_data: UserRegister):
- """
- Register a new user.
-
- Args:
- user_data: User registration data
-
- Returns:
- Success message with user_id
-
- Raises:
- HTTPException: 409 if username or email already exists
- HTTPException: 400 if validation fails
- """
- user = AuthService.register_user(
- username=user_data.username,
- email=user_data.email,
- password=user_data.password
- )
-
- return {
- "message": "用户注册成功",
- "user_id": user.id
- }
- @router.post("/login", response_model=TokenResponse)
- async def login(credentials: UserLogin):
- """
- Authenticate user and return JWT tokens.
-
- Args:
- credentials: User login credentials
-
- Returns:
- Access token, refresh token, and user info
-
- Raises:
- HTTPException: 401 if credentials are invalid
- """
- result = AuthService.login_user(
- username=credentials.username,
- password=credentials.password
- )
-
- return TokenResponse(
- access_token=result["access_token"],
- refresh_token=result["refresh_token"],
- user=UserResponse(**result["user"])
- )
- @router.post("/refresh", response_model=TokenResponse)
- async def refresh_token(token_data: TokenRefresh):
- """
- Refresh access token using refresh token.
-
- Args:
- token_data: Refresh token
-
- Returns:
- New access token and refresh token
-
- Raises:
- HTTPException: 401 if refresh token is invalid or expired
- """
- result = AuthService.refresh_tokens(token_data.refresh_token)
-
- return TokenResponse(
- access_token=result["access_token"],
- refresh_token=result["refresh_token"],
- user=UserResponse(**result["user"])
- )
- @router.get("/me", response_model=UserResponse)
- async def get_current_user(request: Request):
- """
- Get current authenticated user info.
-
- Args:
- request: FastAPI Request with user info in state
-
- Returns:
- Current user information
-
- Raises:
- HTTPException: 401 if not authenticated
- """
- user_data = getattr(request.state, "user", None)
-
- if not user_data:
- raise HTTPException(
- status_code=status.HTTP_401_UNAUTHORIZED,
- detail="未认证"
- )
-
- user = AuthService.get_current_user(user_data["id"])
-
- return UserResponse(
- id=user.id,
- username=user.username,
- email=user.email,
- role=user.role,
- created_at=user.created_at
- )
|