auth.py 1.0 KB

123456789101112131415161718192021222324252627282930313233
  1. from fastapi import APIRouter, Depends, HTTPException
  2. from pydantic import BaseModel
  3. from sqlalchemy import select
  4. from sqlalchemy.ext.asyncio import AsyncSession
  5. from app.database import get_db
  6. from app.models.user import User
  7. import bcrypt
  8. import logging
  9. logger = logging.getLogger(__name__)
  10. router = APIRouter(prefix="/api/auth", tags=["auth"])
  11. class LoginRequest(BaseModel):
  12. username: str
  13. password: str
  14. @router.post("/login")
  15. async def login(payload: LoginRequest, db: AsyncSession = Depends(get_db)):
  16. result = await db.execute(
  17. select(User).where(User.username == payload.username)
  18. )
  19. user = result.scalar_one_or_none()
  20. if not user or not user.is_active:
  21. raise HTTPException(status_code=401, detail="用户名或密码错误")
  22. pw_hash = user.password_hash.encode("utf-8")
  23. if not bcrypt.checkpw(payload.password.encode("utf-8"), pw_hash):
  24. raise HTTPException(status_code=401, detail="用户名或密码错误")
  25. return {"message": "登录成功", "username": user.username}