""" AmazingData 数据服务平台 - 认证 API """ from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm import Session from datetime import datetime from backend.models.database import get_db from backend.models.tables import User from backend.models.schemas import LoginRequest, LoginResponse, UserInfo, BaseResponse from backend.auth.jwt_handler import verify_password, create_access_token from backend.auth.dependencies import get_current_active_user router = APIRouter() @router.post("/login", response_model=LoginResponse) async def login(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): """用户登录""" user = db.query(User).filter(User.username == form_data.username).first() if not user or not verify_password(form_data.password, user.password_hash): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) if not user.is_active: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Inactive user") # 更新最后登录时间 user.last_login = datetime.utcnow() db.commit() # 创建 Token access_token = create_access_token(data={"sub": user.username, "role": user.role}) return LoginResponse( access_token=access_token, token_type="bearer", user_info={ "id": user.id, "username": user.username, "role": user.role, "is_active": user.is_active, "last_login": user.last_login } ) @router.post("/login-json", response_model=LoginResponse) async def login_json(request: LoginRequest, db: Session = Depends(get_db)): """用户登录(JSON 格式)""" user = db.query(User).filter(User.username == request.username).first() if not user or not verify_password(request.password, user.password_hash): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password" ) if not user.is_active: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Inactive user") user.last_login = datetime.utcnow() db.commit() access_token = create_access_token(data={"sub": user.username, "role": user.role}) return LoginResponse( access_token=access_token, token_type="bearer", user_info={ "id": user.id, "username": user.username, "role": user.role, "is_active": user.is_active, "last_login": user.last_login } ) @router.get("/me", response_model=BaseResponse) async def get_current_user_info(current_user: User = Depends(get_current_active_user)): """获取当前用户信息""" return BaseResponse( data={ "id": current_user.id, "username": current_user.username, "role": current_user.role, "is_active": current_user.is_active, "last_login": current_user.last_login } ) @router.post("/logout", response_model=BaseResponse) async def logout(current_user: User = Depends(get_current_active_user)): """用户登出""" return BaseResponse(message="Logout successful")