from datetime import timedelta from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm import Session import os import bcrypt from app.config import settings from app.database.database import get_db from app.models.user import User from app.schemas.auth import Token from app.common.utils import create_access_token router = APIRouter(prefix="/auth", tags=["认证"]) @router.post("/login", response_model=Token) def login(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): """用户登录""" user = db.query(User).filter(User.username == form_data.username).first() # 密码验证:使用bcrypt直接验证密码 if not user or not bcrypt.checkpw(form_data.password.encode('utf-8'), user.password.encode('utf-8')): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) access_token_expires = timedelta(minutes=settings.access_token_expire_minutes) access_token = create_access_token( data={"sub": user.username}, expires_delta=access_token_expires ) return {"access_token": access_token, "token_type": "bearer"}