"""认证 API。""" from fastapi import APIRouter, HTTPException, status from app.config import get_settings from app.deps import CurrentUser, DBSession from app.models.user import User from app.schemas.auth import ( ChangePasswordRequest, LoginRequest, MessageResponse, TokenResponse, UserOut, ) from app.security import create_access_token, hash_password, verify_password router = APIRouter(prefix="/auth", tags=["auth"]) @router.post("/login", response_model=TokenResponse) def login(payload: LoginRequest, db: DBSession) -> TokenResponse: user = db.query(User).filter(User.username == payload.username).first() if not user or not user.is_active or not verify_password(payload.password, user.password_hash): raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials") token = create_access_token(user.username, extra={"uid": user.id, "adm": user.is_admin}) return TokenResponse(access_token=token, expires_in=get_settings().JWT_EXPIRE_MINUTES * 60) @router.get("/me", response_model=UserOut) def me(user: CurrentUser) -> User: return user @router.post("/change-password", response_model=MessageResponse) def change_password(payload: ChangePasswordRequest, user: CurrentUser, db: DBSession) -> MessageResponse: if not verify_password(payload.old_password, user.password_hash): raise HTTPException(status_code=400, detail="原密码错误") user.password_hash = hash_password(payload.new_password) db.commit() return MessageResponse(message="Password updated")