API密钥管理
创建和管理API密钥,实现程序化访问和自动化集成
API密钥管理让您可以创建、管理和监控用于访问平台API的密钥,实现自动化集成和程序化访问。
功能概览
核心功能
- 密钥生成 - 创建具有不同权限的API密钥
- 权限控制 - 细粒度的权限管理
- 使用监控 - 追踪API密钥的使用情况
- 速率限制 - 控制API调用频率
- 安全管理 - 密钥吊销和过期管理
API密钥统计
进入API密钥管理页面,顶部显示密钥使用概况:
📊 密钥概览
- 总密钥数 - 已创建的API密钥总数
- 活跃密钥 - 当前有效的密钥数量
- 过期密钥 - 已过期的密钥数量
- 已吊销密钥 - 已被吊销的密钥数量
📈 使用统计
- 总请求数 - 所有密钥的累计请求次数
- 本月请求 - 当月的API调用次数
- 平均响应时间 - API的平均响应速度
- 错误率 - API调用失败的比例
🔒 安全状态
- 即将过期 - 30天内将过期的密钥
- 异常活动 - 检测到的异常使用行为
- 最后使用 - 最近一次API调用时间
创建API密钥
基本信息
点击 "创建API密钥" 按钮开始:
密钥名称
- 名称 - 便于识别的密钥名称(必填)
- 例如:生产环境密钥、测试密钥、自动化脚本
- 描述 - 密钥用途说明(可选)
- 例如:用于CI/CD自动化部署
过期设置
选择密钥的有效期:
- 永不过期 - 密钥长期有效(不推荐)
- 30天 - 短期测试使用
- 90天 - 临时项目
- 180天 - 半年有效期
- 1年 - 长期项目
- 自定义 - 指定具体过期日期
💡 安全建议:出于安全考虑,建议设置合理的过期时间,并定期轮换密钥。
权限配置
选择API密钥的访问权限:
只读权限(Read)
允许读取数据但不能修改:
- ✅ 获取网站列表
- ✅ 查看分析报告
- ✅ 读取关键词数据
- ✅ 查看统计信息
- ❌ 创建/修改/删除资源
适用场景:
- 数据展示仪表板
- 报表系统集成
- 监控和告警系统
写入权限(Write)
允许创建和修改资源:
- ✅ 只读权限的所有功能
- ✅ 创建新网站
- ✅ 添加关键词
- ✅ 上传数据源
- ✅ 创建内容
- ❌ 删除资源
适用场景:
- 内容管理系统集成
- 自动化内容发布
- 批量数据导入
完全权限(Full)
拥有所有操作权限:
- ✅ 读取权限的所有功能
- ✅ 写入权限的所有功能
- ✅ 删除资源
- ✅ 修改设置
- ✅ 管理用户和团队
适用场景:
- 管理员自动化脚本
- 完整系统集成
- 开发和测试环境
⚠️ 警告:完全权限密钥具有最高权限,请谨慎保管,仅在必要时使用。
速率限制
设置API调用频率限制:
预设限制
- 开发环境 - 100次/小时
- 生产环境(基础) - 1,000次/小时
- 生产环境(标准) - 5,000次/小时
- 生产环境(专业) - 10,000次/小时
- 自定义 - 根据套餐自定义限制
限制说明
- 超过速率限制会返回
429 Too Many Requests错误 - 限制按小时滚动窗口计算
- 可在密钥详情页查看当前使用情况
创建确认
点击 "创建" 按钮后:
- 系统生成密钥 - 创建唯一的API密钥
- 显示完整密钥 - 仅此一次显示完整密钥
- 安全保存 - 将密钥保存到安全位置
- 确认保存 - 确认已保存后关闭窗口
🔐 重要提示:
- 密钥仅在创建时显示一次
- 无法再次查看完整密钥
- 丢失后需要重新创建
- 请妥善保管,不要泄露
API密钥列表
列表视图
显示所有创建的API密钥:
| 列 | 说明 |
|---|---|
| 名称 | 密钥名称和描述 |
| 密钥前缀 | 密钥的前8位字符 |
| 密钥提示 | 密钥的后4位字符 |
| 权限 | 密钥的权限级别 |
| 速率限制 | 每小时调用次数限制 |
| 状态 | 活跃/过期/已吊销 |
| 总请求 | 累计请求次数 |
| 最后使用 | 最近一次使用时间 |
| 过期时间 | 密钥过期日期 |
| 操作 | 查看/吊销/删除 |
状态标识
🟢 活跃(Active)
- 密钥正常可用
- 在有效期内
- 未被吊销
🔴 过期(Expired)
- 已超过有效期
- 无法再使用
- 建议删除或更新
⚫ 已吊销(Revoked)
- 已被手动吊销
- 立即失效
- 无法恢复
密钥识别
由于安全原因,列表中不显示完整密钥,仅显示:
- 前缀:
sk_live_abcd1234(前8位) - 提示:
...xyz9(后4位)
例如:sk_live_abcd1234...xyz9
这样既能识别密钥,又不会泄露完整内容。
密钥详情
点击密钥名称查看详细信息:
基本信息
- 密钥名称 - 显示名称
- 描述 - 用途说明
- 密钥ID - 系统唯一标识符
- 密钥提示 - 前缀和后缀
- 创建时间 - 密钥创建日期
- 创建者 - 创建该密钥的用户
权限和限制
- 权限级别 - Read/Write/Full
- 权限详情 - 具体权限列表
- 速率限制 - 每小时调用限制
- 当前使用 - 本小时已使用次数
- 剩余额度 - 本小时剩余调用次数
使用统计
请求统计
- 总请求数 - 累计API调用次数
- 成功请求 - 成功的调用数
- 失败请求 - 失败的调用数
- 平均响应时间 - API响应速度
时间分布
- 最后使用时间 - 最近一次调用
- 首次使用时间 - 第一次调用
- 活跃天数 - 使用的天数
- 平均日请求 - 每天平均调用次数
使用趋势图
- 按天展示请求量趋势
- 识别使用模式
- 发现异常峰值
安全信息
过期管理
- 过期时间 - 密钥失效日期
- 剩余天数 - 距离过期的天数
- 过期提醒 - 即将过期的警告
吊销记录
- 是否已吊销 - 吊销状态
- 吊销时间 - 吊销操作时间
- 吊销原因 - 吊销说明
- 操作人 - 执行吊销的用户
使用位置
- 最后使用IP - 最近调用的IP地址
- 常用IP - 频繁使用的IP列表
- 地理位置 - IP对应的地理位置
- 异常检测 - 异常使用提示
密钥操作
复制密钥提示
点击复制图标复制密钥提示:
sk_live_abcd1234...xyz9
虽然这不是完整密钥,但可以帮助您识别密钥。
查看使用日志
点击 "查看日志" 查看详细的API调用记录:
| 时间 | 端点 | 方法 | 状态 | 响应时间 | IP地址 |
|---|---|---|---|---|---|
| 2024-12-09 10:30:15 | /api/sites | GET | 200 | 45ms | 1.2.3.4 |
| 2024-12-09 10:28:32 | /api/keywords | POST | 201 | 120ms | 1.2.3.4 |
日志保留最近30天的记录。
吊销密钥
如果密钥泄露或不再需要,立即吊销:
- 点击密钥的 "吊销" 按钮
- 输入吊销原因(可选)
- 确认吊销操作
- 密钥立即失效
⚠️ 注意:
- 吊销后密钥立即失效
- 使用该密钥的应用会收到认证错误
- 吊销操作不可撤销
- 需要时重新创建新密钥
吊销场景
何时应该吊销密钥:
- 🚨 密钥泄露 - 密钥被意外公开
- 🔄 定期轮换 - 按安全策略定期更换
- 👤 员工离职 - 相关人员离职
- 🛠️ 项目结束 - 项目不再需要访问
- 📱 设备丢失 - 存储密钥的设备遗失
删除密钥
永久删除不需要的密钥记录:
- 点击密钥的 "删除" 按钮
- 确认删除操作
- 密钥及其历史记录被删除
⚠️ 警告:
- 只能删除已过期或已吊销的密钥
- 活跃密钥需要先吊销才能删除
- 删除后无法恢复
- 历史统计数据会丢失
刷新密钥
更新现有密钥(保持权限不变):
- 点击密钥的 "刷新" 按钮
- 系统生成新的密钥字符串
- 旧密钥立即失效
- 显示新密钥(仅一次)
- 更新应用中的密钥
适用场景:
- 定期密钥轮换
- 怀疑密钥可能泄露
- 安全策略要求
密钥使用
认证方式
在API请求中使用密钥:
HTTP Header认证(推荐)
curl -X GET https://api.solokit.com/v1/sites \
-H "Authorization: Bearer sk_live_your_api_key_here" \
-H "Content-Type: application/json"
Query参数认证
curl -X GET "https://api.solokit.com/v1/sites?api_key=sk_live_your_api_key_here"
💡 推荐:使用Header认证更安全,避免密钥出现在URL日志中。
代码示例
JavaScript/Node.js
const fetch = require('node-fetch');
const apiKey = 'sk_live_your_api_key_here';
const baseUrl = 'https://api.solokit.com/v1';
async function getSites() {
const response = await fetch(`${baseUrl}/sites`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
}
});
const data = await response.json();
return data;
}
getSites().then(sites => {
console.log('Sites:', sites);
});
Python
import requests
api_key = 'sk_live_your_api_key_here'
base_url = 'https://api.solokit.com/v1'
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
response = requests.get(f'{base_url}/sites', headers=headers)
sites = response.json()
print('Sites:', sites)
PHP
<?php
$apiKey = 'sk_live_your_api_key_here';
$baseUrl = 'https://api.solokit.com/v1';
$ch = curl_init($baseUrl . '/sites');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$sites = json_decode($response, true);
print_r($sites);
curl_close($ch);
?>
错误处理
处理API认证错误:
401 Unauthorized
{
"error": {
"code": "invalid_api_key",
"message": "The API key provided is invalid or has been revoked."
}
}
原因:
- 密钥不存在或格式错误
- 密钥已被吊销
- 密钥已过期
403 Forbidden
{
"error": {
"code": "insufficient_permissions",
"message": "This API key does not have permission to perform this action."
}
}
原因:
- 密钥权限不足
- 尝试访问未授权的资源
429 Too Many Requests
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Please retry after 3600 seconds.",
"retry_after": 3600
}
}
原因:
- 超过速率限制
- 需要等待后重试
安全最佳实践
密钥存储
✅ 推荐做法
-
环境变量
# .env文件 SOLOKIT_API_KEY=sk_live_your_api_key_here -
密钥管理服务
- AWS Secrets Manager
- Azure Key Vault
- HashiCorp Vault
- Google Secret Manager
-
配置文件(不提交到版本控制)
{ "apiKey": "sk_live_your_api_key_here" }# .gitignore config.json .env .env.local
❌ 禁止做法
-
硬编码在代码中
// ❌ 不要这样做 const apiKey = 'sk_live_abc123...'; -
提交到版本控制
# ❌ 不要提交包含密钥的文件 git add .env -
在客户端使用
// ❌ 不要在前端暴露API密钥 fetch('https://api.solokit.com/v1/sites', { headers: { 'Authorization': 'Bearer sk_live_...' } });
权限最小化
遵循最小权限原则:
- 📖 只读场景使用只读密钥 - 不需要写入权限时使用Read
- ✏️ 写入场景使用写入密钥 - 不需要删除权限时使用Write
- 🔐 避免过度授权 - 不要默认使用Full权限
- 🎯 按应用分配密钥 - 每个应用使用独立密钥
定期轮换
建立密钥轮换机制:
轮换策略
- 生产环境 - 每90天轮换一次
- 开发环境 - 每30天轮换一次
- 临时密钥 - 使用后立即删除
- 共享密钥 - 人员变动后立即轮换
轮换流程
- 创建新的API密钥
- 在应用中配置新密钥(保留旧密钥作为备用)
- 验证新密钥工作正常
- 吊销旧密钥
- 从应用中移除旧密钥
监控异常
设置监控和告警:
监控指标
- 异常流量 - 请求量突然激增
- 新IP地址 - 从未见过的IP访问
- 高错误率 - 认证失败率上升
- 异常时间 - 非工作时间的访问
告警设置
在 "通知设置" 中配置:
- API密钥异常使用告警
- 速率限制告警
- 密钥即将过期提醒
- 认证失败次数告警
泄露响应
如果密钥泄露,立即采取行动:
应急步骤
- ⚡ 立即吊销密钥 - 防止进一步滥用
- 🔍 检查使用日志 - 确认是否被滥用
- 🆕 创建新密钥 - 生成替代密钥
- 🔄 更新应用 - 在所有应用中更新密钥
- 📊 审查影响 - 评估潜在损失
- 📝 记录事件 - 文档化事件和响应
预防措施
- 定期审查密钥使用情况
- 使用密钥管理服务
- 实施代码审查
- 使用自动化扫描工具检测泄露
使用场景
CI/CD集成
在持续集成/部署流程中使用:
# GitHub Actions示例
name: Deploy
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run SEO Analysis
env:
SOLOKIT_API_KEY: ${{ secrets.SOLOKIT_API_KEY }}
run: |
curl -X POST https://api.solokit.com/v1/sites/analyze \
-H "Authorization: Bearer $SOLOKIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id": "site_123"}'
监控和告警
定期检查SEO状态:
# 监控脚本
import requests
import time
def check_seo_health():
api_key = os.environ['SOLOKIT_API_KEY']
response = requests.get(
'https://api.solokit.com/v1/sites/health',
headers={'Authorization': f'Bearer {api_key}'}
)
if response.status_code == 200:
data = response.json()
if data['health_score'] < 70:
send_alert(f"SEO健康度下降: {data['health_score']}")
# 每小时检查一次
while True:
check_seo_health()
time.sleep(3600)
批量操作
批量导入数据:
const apiKey = process.env.SOLOKIT_API_KEY;
async function batchImportKeywords(keywords) {
const response = await fetch('https://api.solokit.com/v1/keywords/batch', {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ keywords })
});
return await response.json();
}
// 导入关键词
const keywords = [
{ keyword: 'SEO工具', language: 'zh', search_volume: 10000 },
{ keyword: 'SEO优化', language: 'zh', search_volume: 8000 }
];
batchImportKeywords(keywords).then(result => {
console.log('Import result:', result);
});
数据同步
与其他系统同步数据:
// 从Solokit同步到内部系统
async function syncSEOData() {
// 获取SEO报告
const reports = await fetch('https://api.solokit.com/v1/reports', {
headers: { 'Authorization': `Bearer ${apiKey}` }
}).then(r => r.json());
// 同步到内部数据库
for (const report of reports) {
await saveToInternalDB(report);
}
console.log(`Synced ${reports.length} reports`);
}
// 每天同步一次
setInterval(syncSEOData, 24 * 60 * 60 * 1000);
配额和限制
密钥数量限制
根据订阅套餐:
| 套餐 | 密钥数量 |
|---|---|
| 免费版 | 2个 |
| 基础版 | 5个 |
| 专业版 | 20个 |
| 企业版 | 无限制 |
速率限制
根据密钥权限和套餐:
| 密钥类型 | 免费版 | 基础版 | 专业版 | 企业版 |
|---|---|---|---|---|
| Read | 100/小时 | 1,000/小时 | 5,000/小时 | 10,000/小时 |
| Write | 50/小时 | 500/小时 | 2,500/小时 | 5,000/小时 |
| Full | 不可用 | 500/小时 | 2,500/小时 | 10,000/小时 |
超过限制后需要等待一个小时才能继续调用。
常见问题
如何找回丢失的API密钥?
无法找回。出于安全考虑,系统不存储完整密钥。如果丢失:
- 吊销丢失的密钥
- 创建新的密钥
- 在应用中更新密钥
可以共享API密钥吗?
不建议。每个应用或用户应该有独立的密钥,这样:
- 更容易追踪使用情况
- 可以独立管理权限
- 出问题时影响范围小
- 人员变动时易于处理
密钥被限流了怎么办?
如果遇到429错误:
- 等待重试 - 响应头中有
Retry-After时间 - 优化请求 - 减少不必要的API调用
- 实施缓存 - 缓存常用数据
- 升级套餐 - 获得更高的速率限制
如何在团队中管理密钥?
推荐做法:
- 使用密钥管理服务(如AWS Secrets Manager)
- 按项目/环境创建不同的密钥
- 文档化每个密钥的用途
- 定期审查和轮换密钥
- 人员变动时及时更新