auth.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. """
  2. Authentication schemas for request/response validation.
  3. Defines Pydantic models for user registration, login, and token management.
  4. """
  5. from pydantic import BaseModel, EmailStr, Field
  6. from typing import Optional, TYPE_CHECKING
  7. from datetime import datetime
  8. class UserRegister(BaseModel):
  9. """User registration request schema."""
  10. username: str = Field(..., min_length=3, max_length=50, description="用户名,3-50个字符")
  11. email: EmailStr = Field(..., description="有效的邮箱地址")
  12. password: str = Field(..., min_length=8, max_length=100, description="密码,至少8个字符")
  13. class UserLogin(BaseModel):
  14. """User login request schema."""
  15. username: str = Field(..., description="用户名")
  16. password: str = Field(..., description="密码")
  17. class UserResponse(BaseModel):
  18. """User response schema."""
  19. id: str = Field(..., description="用户ID")
  20. username: str = Field(..., description="用户名")
  21. email: str = Field(..., description="邮箱")
  22. role: str = Field(..., description="用户角色")
  23. created_at: datetime = Field(..., description="创建时间")
  24. class Config:
  25. from_attributes = True
  26. class TokenResponse(BaseModel):
  27. """Token response schema."""
  28. access_token: str = Field(..., description="访问令牌")
  29. refresh_token: str = Field(..., description="刷新令牌")
  30. token_type: str = Field(default="bearer", description="令牌类型")
  31. user: UserResponse = Field(..., description="用户信息")
  32. class TokenRefresh(BaseModel):
  33. """Token refresh request schema."""
  34. refresh_token: str = Field(..., description="刷新令牌")
  35. class TokenPayload(BaseModel):
  36. """JWT token payload schema."""
  37. sub: str = Field(..., description="用户ID")
  38. username: str = Field(..., description="用户名")
  39. email: str = Field(..., description="邮箱")
  40. role: str = Field(..., description="角色")
  41. exp: datetime = Field(..., description="过期时间")
  42. iat: datetime = Field(..., description="签发时间")
  43. type: str = Field(..., description="令牌类型: access 或 refresh")