auth.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334
  1. """认证路由:用户注册、OAuth2 登录并返回 JWT。"""
  2. from fastapi import APIRouter, Depends, HTTPException, status
  3. from fastapi.security import OAuth2PasswordRequestForm
  4. from sqlmodel import Session, select
  5. from app.core.security import create_access_token, hash_password, verify_password
  6. from app.db import get_session
  7. from app.models import User
  8. from app.schemas import RegisterRequest, TokenResponse, UserPublic
  9. #创建路由
  10. router = APIRouter(prefix="/auth", tags=["auth"])
  11. #用户注册接口
  12. @router.post("/register", response_model=UserPublic)
  13. def register(payload: RegisterRequest, session: Session = Depends(get_session)):
  14. existing = session.exec(select(User).where(User.username == payload.username)).first()
  15. if existing:
  16. raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Username already exists")
  17. #创建用户
  18. user = User(username=payload.username, password_hash=hash_password(payload.password), role=payload.role)
  19. session.add(user)
  20. session.commit()
  21. session.refresh(user)
  22. return user
  23. #用户登录接口
  24. @router.post("/token", response_model=TokenResponse)
  25. def login(form: OAuth2PasswordRequestForm = Depends(), session: Session = Depends(get_session)):
  26. user = session.exec(select(User).where(User.username == form.username)).first()
  27. if not user or not verify_password(form.password, user.password_hash):
  28. raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password")
  29. token = create_access_token(subject=str(user.id), extra={"role": user.role})
  30. return TokenResponse(access_token=token)