一、后端API代理服务器搭建
由于前端直接调用腾讯混元API会暴露密钥,需要搭建一个后端代理服务器。使用Flask框架快速实现。
🔧 技术栈
Flask + OpenAI Python客户端 + 腾讯混元API
🔑 密钥管理
通过环境变量读取API密钥,避免硬编码
🌐 端点设计
POST /chat 用于对话,GET /health 用于健康检查
🔄 请求转发
将前端请求转发到腾讯混元API,返回结果
核心代码实现
from flask import Flask, request, jsonify
from flask_cors import CORS
from openai import OpenAI
import os
app = Flask(__name__)
CORS(app)
client = OpenAI(
api_key=os.getenv('OPENAI_API_KEY'),
base_url="https://tokenhub.tencentmaas.com/v1"
)
@app.route('/health', methods=['GET'])
def health_check():
return jsonify({"status": "ok"})
@app.route('/chat', methods=['POST'])
def chat():
try:
data = request.json
messages = data.get('messages', [])
response = client.chat.completions.create(
model="hy3",
messages=messages,
temperature=0.7
)
return jsonify({
"response": response.choices[0].message.content
})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
✅ 关键配置:使用
os.getenv('OPENAI_API_KEY')从环境变量读取密钥,确保密钥不会被提交到版本控制。base_url设置为腾讯Maas服务地址。
二、前端AI助手集成
前端需要实现对话界面、消息发送、回复接收和加载动画。
对话历史管理
class AIAssistant {
constructor() {
this.conversationHistory = [];
}
async sendMessage(message) {
this.conversationHistory.push({
role: 'user',
content: message
});
const response = await fetch('/api/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
messages: this.conversationHistory
})
});
const data = await response.json();
this.conversationHistory.push({
role: 'assistant',
content: data.response
});
return data.response;
}
}
三级回答优先级逻辑
设计了一套智能回答机制,优先使用本地知识库,提升响应速度:
- 常用问题预设答案: 匹配到预设问题直接返回答案,无需调用API
- 关键词匹配本地知识库: 用户输入优先匹配本地关键词库,快速响应
- API调用: 未匹配到本地答案时,调用后端API获取AI回答
async getAnswer(userInput) {
const presetQuestions = {
"关于网站": "欢迎访问RongLong Tech技术博客...",
"联系方式": "你可以通过邮件联系我..."
};
for (const [key, value] of Object.entries(presetQuestions)) {
if (userInput.includes(key)) {
return value;
}
}
const localAnswers = this.matchKeywords(userInput);
if (localAnswers) {
return localAnswers;
}
return await this.callAPI(userInput);
}
三、安全防护措施
API服务上线前必须做好安全防护,防止恶意攻击和滥用。
后端安全
- 输入验证: 对用户输入进行严格验证,防止注入攻击
- 请求限流: 使用Flask-Limiter限制API调用频率
- 日志记录: 记录所有请求,便于排查问题
- 错误处理: 返回友好的错误信息,不暴露系统细节
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
limiter = Limiter(
get_remote_address,
app=app,
default_limits=["100 per minute", "1000 per hour"]
)
@app.route('/chat', methods=['POST'])
@limiter.limit("50 per minute")
def chat():
data = request.json
if not data or 'messages' not in data:
return jsonify({"error": "Invalid request"}), 400
messages = data['messages']
if not isinstance(messages, list):
return jsonify({"error": "Messages must be a list"}), 400
for msg in messages:
if 'role' not in msg or 'content' not in msg:
return jsonify({"error": "Invalid message format"}), 400
前端安全
- XSS防护: 使用DOMPurify清理用户输入和AI返回内容
- CSP配置: 设置Content Security Policy限制资源加载
- 请求加密: 通过HTTPS传输,防止中间人攻击
import DOMPurify from 'dompurify';
function renderMessage(content) {
const cleanContent = DOMPurify.sanitize(content);
const messageElement = document.createElement('div');
messageElement.innerHTML = cleanContent;
return messageElement;
}
Cloudflare Edge安全
项目通过Cloudflare部署,可利用Cloudflare的安全功能:
- WAF规则: 配置Web Application Firewall阻止常见攻击
- 速率限制: 在Edge层设置请求速率限制
- Bot管理: 使用Cloudflare Bot Management识别和阻止恶意爬虫
⚠️ 安全提醒: 如果API密钥曾经提交到git历史中,必须立即轮换!即使删除了包含密钥的文件,git历史中仍然存在。使用
git filter-branch或git rm --cached清除历史中的敏感信息。
四、API密钥同步更新
在腾讯平台更换API密钥后,需要同步更新到Web程序中:
更新方法
- 更新环境变量: 在部署平台(如Cloudflare Pages、Vercel、服务器)中更新环境变量
- 重启服务: 确保新的环境变量生效
- 验证: 发送测试请求确认新密钥正常工作
验证步骤
# 1. 检查环境变量是否正确设置
echo $OPENAI_API_KEY
# 2. 发送测试请求
curl -X POST http://localhost:5000/chat \
-H "Content-Type: application/json" \
-d '{"messages":[{"role":"user","content":"你好"}]}'
# 3. 检查返回结果是否包含正常响应
✅ 更新注意事项:
- 更换密钥后,旧密钥立即失效,需要确保所有使用该密钥的服务都已更新
- 建议使用密钥轮换策略,定期更换API密钥
- 不要在代码中硬编码密钥,始终使用环境变量
- 在生产环境中,使用密钥管理服务(如AWS Secrets Manager、HashiCorp Vault)管理密钥
遇到的问题汇总
| 问题 | 原因 | 解决 |
|---|---|---|
| 前端直接调用API暴露密钥 | 浏览器端无法隐藏API密钥 | 搭建后端代理服务器,前端只调用代理接口 |
| API调用无响应 | 网络问题或密钥错误 | 检查环境变量、网络连接和API端点 |
| 对话历史丢失 | 前端未正确维护conversationHistory | 每次请求都包含完整的对话历史 |
| API被恶意调用 | 缺乏限流和验证机制 | 添加请求限流和输入验证 |