本教程详细演示如何为FastAPI构建的MLOps应用添加API密钥认证,包含完整代码实现从模型训练到安全部署的全流程,确保只有授权用户能访问预测接口。
FastAPI端点安全认证实战指南
项目初始化
首先创建Python虚拟环境并安装依赖库:
1
2
3
|
python -m venv venv
source venv/bin/activate
pip install fastapi uvicorn scikit-learn pandas joblib python-dotenv
|
模型训练
创建train_model.py
训练随机森林分类器:
1
2
3
4
5
6
7
|
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
import joblib
X, y = load_wine(return_X_y=True, as_frame=False)
model = RandomForestClassifier(n_estimators=200).fit(X, y)
joblib.dump(model, "wine_clf.joblib")
|
基础FastAPI应用
构建main.py
实现预测接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
app = FastAPI()
MODEL = joblib.load("wine_clf.joblib")
class WineRequest(BaseModel):
data: List[List[float]]
@app.post("/predict")
async def predict(payload: WineRequest):
return {"predictions": MODEL.predict(payload.data).tolist()}
|
实现API密钥认证
- 创建
.env
文件存储密钥:
1
|
API_KEY=your_secure_key
|
- 更新
main.py
添加认证逻辑:
1
2
3
4
5
6
7
|
from fastapi.security import APIKeyHeader
api_key_header = APIKeyHeader(name="X-API-Key")
async def verify_key(api_key: str = Depends(api_key_header)):
if api_key != os.getenv("API_KEY"):
raise HTTPException(status_code=401)
|
- 保护预测端点:
1
2
3
|
@app.post("/predict", dependencies=[Depends(verify_key)])
async def predict(payload: WineRequest):
[...]
|
测试验证
- 无密钥请求返回401错误
- 错误密钥返回401错误
- 正确密钥示例:
1
2
3
|
curl -X POST http://localhost:8000/predict \
-H "X-API-Key: your_secure_key" \
-d '{"data":[[14.23,1.71,2.43,15.6,127,2.80,3.06,0.28,2.29,5.64,1.04,3.92,1065]]}'
|
生产建议
- 使用环境变量管理敏感信息
- 考虑集成OAuth2进行更复杂的权限控制
- 部署时启用HTTPS加密通信