feat(api): API Key + Redis 限流 + 用量统计 (M5a) #7
Reference in New Issue
Block a user
Delete Branch "devin/1781943842-m5a-api-key-ratelimit"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
为公开只读 API 增加一层可选 API Key:持 Key 调用可获得更高的每分钟速率上限并归属用量;匿名调用仍然允许,按客户端 IP 走较低额度(默认 60/min)。API 定位不变——免费、只读、无交易端点。
公开服务对 PostgreSQL 仍保持只读:Key 校验只做
SELECT,所有计数(限流窗口 + 用量)都落在 Redis;签发/吊销由后台(admin,本就有写权限)完成。Redis 不可用时全部 fail-open(放行 + 用量显示为 0)。主要改动
0008_api_key:api_key表只存key_hash(sha256) + 展示用key_prefix,明文仅创建时返回一次;含tier/rate_limit_per_min/revoked_at。apikey包:生成og_live_<random>Key + sha256 哈希。ratelimit包:Redis 固定窗口限流 + 按 key 的total/today/last_used用量;未配置/不可达均 fail-open。/api/v1):读取X-API-Key或Authorization: Bearer og_...;非法/吊销→401;每个响应回写X-RateLimit-Limit/Remaining/Reset;超额→429+Retry-After;匿名按 IP、持 Key 按 key-id 各自限流。GET/POST/DELETE /ping/api/keys签发/列表(含用量)/吊销 + 运营后台「API 密钥」标签页。测试
本地 docker postgres+redis:迁移 up/down-all/up 可逆;
go vet/gofmt/go test ./...全过。新增apikey/ratelimit/handler中间件单测(依赖 Redis 的用例在无 Redis 环境自动 skip)。真实 HTTP 烟测 200/429/401 + 各响应头已验证。后台前端npm run build通过。