340 lines
6.4 KiB
Markdown
340 lines
6.4 KiB
Markdown
# API Key 使用指南
|
||
|
||
## ✅ 已启用 API Key 验证
|
||
|
||
现在所有对 `/api/v1/jsx_demo/calculate` 的请求都需要提供有效的 API Key。
|
||
|
||
---
|
||
|
||
## 🔑 当前可用的 API Keys
|
||
|
||
### 1. 测试密钥(开发使用)
|
||
```
|
||
API Key: demo_key_123
|
||
名称: 测试密钥
|
||
权限: calculate
|
||
限制: 100次/小时
|
||
```
|
||
|
||
### 2. 生产密钥(生产环境)
|
||
```
|
||
API Key: prod_key_xyz789abc
|
||
名称: 生产密钥
|
||
权限: calculate, admin
|
||
限制: 1000次/小时
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 日志示例
|
||
|
||
启用 API Key 后,后端日志会显示:
|
||
|
||
```
|
||
============================================================
|
||
📥 收到计算请求
|
||
时间: 2024-12-16 15:30:45
|
||
表达式: 87-98
|
||
API Key: demo_key_123
|
||
============================================================
|
||
✅ API Key 验证通过 | 名称: 测试密钥 | 权限: ['calculate']
|
||
🛡️ 安全检查: 验证表达式格式...
|
||
✅ 表达式格式验证通过
|
||
🔒 开始执行核心算法...
|
||
✅ 计算完成: 87-98 = -11
|
||
============================================================
|
||
```
|
||
|
||
### 如果 API Key 无效:
|
||
|
||
```
|
||
============================================================
|
||
📥 收到计算请求
|
||
时间: 2024-12-16 15:30:45
|
||
表达式: 87-98
|
||
API Key: invalid_key_xxx
|
||
============================================================
|
||
❌ API Key 验证失败: invalid_key_xxx
|
||
```
|
||
|
||
**前端会收到:** `403 Forbidden: 无效的 API Key`
|
||
|
||
---
|
||
|
||
## 🔧 管理 API Keys
|
||
|
||
### 查看所有 Keys
|
||
|
||
打开 `Server/app/core/api_keys.py`:
|
||
|
||
```python
|
||
VALID_KEYS: Dict[str, dict] = {
|
||
"demo_key_123": {
|
||
"name": "测试密钥",
|
||
"created": "2024-12-16",
|
||
"permissions": ["calculate"],
|
||
"rate_limit": 100
|
||
},
|
||
# ... 更多 keys
|
||
}
|
||
```
|
||
|
||
### 添加新的 API Key
|
||
|
||
**方法 1:直接编辑配置文件**
|
||
|
||
在 `api_keys.py` 中添加:
|
||
|
||
```python
|
||
"your_new_key_456": {
|
||
"name": "客户A的密钥",
|
||
"created": "2024-12-16",
|
||
"permissions": ["calculate"],
|
||
"rate_limit": 200
|
||
}
|
||
```
|
||
|
||
**方法 2:使用 Python 代码**
|
||
|
||
```python
|
||
from app.core.api_keys import APIKeyManager
|
||
|
||
# 添加新 Key
|
||
APIKeyManager.add_key(
|
||
api_key="customer_key_789",
|
||
name="客户B的密钥",
|
||
permissions=["calculate", "export"]
|
||
)
|
||
```
|
||
|
||
### 删除 API Key
|
||
|
||
```python
|
||
from app.core.api_keys import APIKeyManager
|
||
|
||
# 删除 Key
|
||
APIKeyManager.remove_key("old_key_123")
|
||
```
|
||
|
||
### 检查权限
|
||
|
||
```python
|
||
from app.core.api_keys import APIKeyManager
|
||
|
||
# 检查是否有权限
|
||
has_permission = APIKeyManager.check_permission("demo_key_123", "calculate")
|
||
```
|
||
|
||
---
|
||
|
||
## 🔒 前端配置
|
||
|
||
### 当前配置(已设置)
|
||
|
||
`Designer/src/api/jsxApi/inline/hybrid-demo.ts`:
|
||
|
||
```typescript
|
||
const response = await fetch(`${config.apiBaseUrl}/jsx_demo/calculate`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'X-API-Key': 'demo_key_123' // 🔐 使用测试密钥
|
||
},
|
||
body: JSON.stringify({
|
||
expression: layerName
|
||
})
|
||
});
|
||
```
|
||
|
||
### 切换到生产密钥
|
||
|
||
修改 API Key:
|
||
|
||
```typescript
|
||
'X-API-Key': 'prod_key_xyz789abc' // 使用生产密钥
|
||
```
|
||
|
||
### 从配置文件读取(推荐)
|
||
|
||
创建 `Designer/src/config/apiKeys.ts`:
|
||
|
||
```typescript
|
||
export const API_KEYS = {
|
||
development: 'demo_key_123',
|
||
production: 'prod_key_xyz789abc'
|
||
};
|
||
|
||
// 根据环境自动选择
|
||
export const getCurrentApiKey = () => {
|
||
return import.meta.env.DEV
|
||
? API_KEYS.development
|
||
: API_KEYS.production;
|
||
};
|
||
```
|
||
|
||
然后在 `hybrid-demo.ts` 中使用:
|
||
|
||
```typescript
|
||
import { getCurrentApiKey } from '@/config/apiKeys';
|
||
|
||
const response = await fetch(`${config.apiBaseUrl}/jsx_demo/calculate`, {
|
||
headers: {
|
||
'X-API-Key': getCurrentApiKey() // 自动选择正确的 Key
|
||
}
|
||
});
|
||
```
|
||
|
||
---
|
||
|
||
## 🧪 测试 API Key 验证
|
||
|
||
### 测试 1:使用有效的 Key
|
||
|
||
1. 创建图层名称:`87-98`
|
||
2. 点击"智能配色"
|
||
3. **预期结果:** ✅ 成功计算
|
||
|
||
**后端日志:**
|
||
```
|
||
✅ API Key 验证通过 | 名称: 测试密钥
|
||
```
|
||
|
||
---
|
||
|
||
### 测试 2:使用无效的 Key
|
||
|
||
临时修改前端,使用错误的 Key:
|
||
|
||
```typescript
|
||
'X-API-Key': 'wrong_key_xxx'
|
||
```
|
||
|
||
**预期结果:** ❌ 403 错误
|
||
|
||
**后端日志:**
|
||
```
|
||
❌ API Key 验证失败: wrong_key_xxx
|
||
```
|
||
|
||
**前端错误:**
|
||
```
|
||
Message.error('无效的 API Key')
|
||
```
|
||
|
||
---
|
||
|
||
### 测试 3:不提供 Key
|
||
|
||
注释掉 API Key:
|
||
|
||
```typescript
|
||
// 'X-API-Key': 'demo_key_123'
|
||
```
|
||
|
||
**预期结果:** ❌ 403 错误
|
||
|
||
**后端日志:**
|
||
```
|
||
❌ API Key 验证失败: None
|
||
```
|
||
|
||
---
|
||
|
||
## 🛡️ 安全最佳实践
|
||
|
||
### ✅ 应该做的
|
||
|
||
1. **不同环境使用不同的 Key**
|
||
- 开发环境:`demo_key_123`
|
||
- 生产环境:`prod_key_xyz789abc`
|
||
|
||
2. **定期更换 Key**
|
||
```python
|
||
# 每季度更新一次
|
||
"new_key_2024_q1": {...}
|
||
```
|
||
|
||
3. **使用环境变量**
|
||
```python
|
||
import os
|
||
API_KEY = os.getenv('DESIGNER_API_KEY', 'demo_key_123')
|
||
```
|
||
|
||
4. **记录所有请求**
|
||
- 已实现:所有请求都会记录 API Key
|
||
|
||
5. **限制调用频率**
|
||
- 已配置:每个 Key 都有 rate_limit
|
||
|
||
### ❌ 不应该做的
|
||
|
||
1. ❌ 把 Key 硬编码在公开的代码中
|
||
2. ❌ 在 Git 中提交包含生产 Key 的文件
|
||
3. ❌ 多个客户共用同一个 Key
|
||
4. ❌ 永远不更换 Key
|
||
|
||
---
|
||
|
||
## 🚀 进一步加强
|
||
|
||
### 1. 数据库存储 API Keys
|
||
|
||
```python
|
||
# models/api_key.py
|
||
class APIKey(Base):
|
||
__tablename__ = "api_keys"
|
||
|
||
key = Column(String, primary_key=True)
|
||
name = Column(String)
|
||
permissions = Column(JSON)
|
||
rate_limit = Column(Integer)
|
||
created_at = Column(DateTime)
|
||
expires_at = Column(DateTime)
|
||
is_active = Column(Boolean, default=True)
|
||
```
|
||
|
||
### 2. Key 过期时间
|
||
|
||
```python
|
||
"demo_key_123": {
|
||
"expires": "2025-12-31", # Key 会过期
|
||
}
|
||
```
|
||
|
||
### 3. 使用量统计
|
||
|
||
```python
|
||
"demo_key_123": {
|
||
"usage_count": 0,
|
||
"last_used": None,
|
||
}
|
||
```
|
||
|
||
### 4. IP 绑定
|
||
|
||
```python
|
||
"demo_key_123": {
|
||
"allowed_ips": ["192.168.1.100", "127.0.0.1"]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 总结
|
||
|
||
| 功能 | 状态 | 说明 |
|
||
|------|------|------|
|
||
| API Key 验证 | ✅ 已启用 | 所有请求必须提供有效 Key |
|
||
| 多 Key 支持 | ✅ 已实现 | 可配置多个不同权限的 Key |
|
||
| 权限控制 | ✅ 已实现 | 每个 Key 可配置不同权限 |
|
||
| 日志记录 | ✅ 已实现 | 记录所有 Key 使用情况 |
|
||
| Key 管理器 | ✅ 已实现 | 提供增删改查 API |
|
||
| 限流配置 | 🔧 已配置 | 待实现实际限流逻辑 |
|
||
| 数据库存储 | ⚠️ 未实现 | 当前使用配置文件 |
|
||
| Key 过期 | ⚠️ 未实现 | 可以扩展 |
|
||
|
||
---
|
||
|
||
**当前 API Key 已启用!所有请求都会被验证和记录!**
|
||
|