devin/1781943842-m5a-api-key-ratelimit
main
为公开只读 API 增加一层可选 API Key:持 Key 调用可获得更高的每分钟速率上限并归属用量;匿名调用仍然允许,按客户端 IP 走较低额度(默认 60/min)。API 定位不变——免费、只读、无交易端点。
公开服务对 PostgreSQL 仍保持只读:Key 校验只做 SELECT,所有计数(限流窗口 + 用量)都落在 Redis;签发/吊销由后台(admin,本就有写权限)完成。Redis 不可用时全部 fail-open(放行 + 用量显示为 0)。
SELECT
0008_api_key
api_key
key_hash
key_prefix
tier
rate_limit_per_min
revoked_at
apikey
og_live_<random>
ratelimit
total/today/last_used
/api/v1
X-API-Key
Authorization: Bearer og_...
401
X-RateLimit-Limit/Remaining/Reset
429
Retry-After
GET/POST/DELETE /ping/api/keys
本地 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 通过。
go vet
gofmt
go test ./...
handler
npm run build
Add an optional API-key layer to the public read-only API. Keys grant higher per-minute rate limits and attribute usage; anonymous callers are still allowed at a lower IP-based budget. - migration 0008_api_key: api_key table (sha256 hash only, plaintext shown once) - apikey pkg: key generation + hashing - ratelimit pkg: Redis fixed-window limiter + per-key usage counters; fails open - public API middleware: X-API-Key / Bearer auth, X-RateLimit-* headers, 429+Retry-After - admin: issue/list/revoke keys + usage view (API + UI tab) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
No dependencies set.
The note is not visible to the blocked user.
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通过。