如何为FastAPI中files列表下方的端点配置用户认证?
实现FastAPI端点的认证保护(针对
files = []下方的所有端点) 方案一:使用FastAPI原生OAuth2认证
这是通用的原生实现方式,无需额外第三方库依赖:
- 导入模块并定义认证依赖
from fastapi import FastAPI, Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer app = FastAPI() # 指定获取token的登录端点(需自行实现该端点) oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") # 自定义token验证逻辑,替换为你的实际业务校验逻辑 async def verify_token(token: str = Depends(oauth2_scheme)): # 示例:简单校验token有效性,实际场景可对接数据库、验证JWT签名等 if not token.startswith("valid-jwt-"): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭证", headers={"WWW-Authenticate": "Bearer"}, ) # 验证通过后可返回用户信息,供后续端点使用 return {"user_id": 1001, "username": "authorized_user"}
- 给
files = []下方的端点添加认证依赖
files = [] # 受保护的文件列表端点 @app.get("/files") async def list_files(current_user = Depends(verify_token)): return {"files": files, "current_user": current_user} # 受保护的文件上传端点 @app.post("/files") async def upload_file(file_info: dict, current_user = Depends(verify_token)): files.append(file_info) return {"message": "文件已添加", "file": file_info}
- 补充实现登录端点(用于生成合法token)
from pydantic import BaseModel class LoginForm(BaseModel): username: str password: str @app.post("/token") async def login(form_data: LoginForm): # 替换为真实的用户名密码校验逻辑 if form_data.username == "admin" and form_data.password == "admin123": return {"access_token": "valid-jwt-xxxxxx", "token_type": "bearer"} raise HTTPException(status_code=400, detail="用户名或密码错误")
方案二:修复AuthX模块的配置
如果坚持使用AuthX,检查以下配置是否正确:
- 安装并初始化AuthX
from fastapi import FastAPI, Depends from authx import AuthX, AuthConfig app = FastAPI() # 配置AuthX核心参数,替换为你的实际密钥和配置 auth_config = AuthConfig( JWT_SECRET_KEY="your-strong-random-secret-key", # 必填,建议用随机生成的长字符串 JWT_ALGORITHM="HS256", JWT_TOKEN_LOCATION=["headers"], JWT_ACCESS_TOKEN_EXPIRE_MINUTES=30 ) # 初始化AuthX实例 auth = AuthX(auth_config) # 获取认证依赖对象 require_auth = auth.get_auth_route()
- 给目标端点添加认证依赖
files = [] @app.get("/files") async def get_files(user = Depends(require_auth)): return {"files": files, "user": user} @app.post("/files") async def add_file(file_data: dict, user = Depends(require_auth)): files.append(file_data) return {"message": "文件添加成功"}
- 补充AuthX登录端点
@app.post("/auth/login") async def login(username: str, password: str): # 替换为真实的用户校验逻辑 if username == "admin" and password == "admin123": token = auth.create_access_token(subject={"username": username}) return {"access_token": token, "token_type": "bearer"} raise HTTPException(status_code=401, detail="认证失败")
批量保护端点的技巧
如果files = []下方有大量端点,推荐用APIRouter批量添加依赖,避免重复编写:
from fastapi import APIRouter, Depends # 创建路由实例并全局绑定认证依赖 file_router = APIRouter(dependencies=[Depends(verify_token)]) # 或Depends(require_auth) # 挂载所有文件相关端点 @file_router.get("/files") async def list_files(): return {"files": files} @file_router.post("/files") async def upload_file(file_info: dict): files.append(file_info) return {"message": "文件已添加"} # 将路由注册到主应用 app.include_router(file_router)
内容的提问来源于stack exchange,提问作者Pinfox150
相关产品推荐
相关产品推荐

