security: external API - only ID+Secret auth, remove legacy key & JWT

- removed x-external-key (single key) auth path + getExternalKey
- removed JWT passthrough in clientAuth (Bearer no longer accepted)
- removed /auth/login (JWT endpoint) and /my-tickets (JWT-only)
- clientAuth now mandatory: missing/invalid/disabled client -> 401
  (closed the 'no config = allow all' authorization bypass)
- moved /auth/register BEHIND clientAuth (was anonymous abuse surface)
- clients mgmt endpoints keep authenticate + role check (admin UI)
- docs + UI copy updated to single auth method
- verified: 30 checks incl. full-tree scan for legacy key refs
This commit is contained in:
2026-08-19 19:44:34 +08:00
parent 4dfc30ce89
commit 6056153f57
4 changed files with 29 additions and 88 deletions

View File

@@ -8,9 +8,7 @@
---
## 一、鉴权(三种方式,任选其一)
### 方式 A:ID + Secret(推荐,多客户端)
## 一、鉴权(唯一方式:ID + Secret)
在站点后台 →「外部API」页面创建客户端,获得一对凭据:
@@ -20,6 +18,7 @@ Secret: s_9f8e7d6c5b4a39281726354a1b2c3d4e5f60718293a4b5c6d7e8f9a0b1c2d3e
```
> ⚠️ Secret 只在创建时显示一次,请立即保存。支持创建多个客户端、单独停用/删除,互不影响。
> 无凭据 / 凭据错误 / 客户端停用 → 一律返回 `401`。
调用时在请求头携带:
@@ -28,18 +27,6 @@ Secret: s_9f8e7d6c5b4a39281726354a1b2c3d4e5f60718293a4b5c6d7e8f9a0b1c2d3e
| `x-api-client-id` | 你的 Client ID |
| `x-api-secret` | 你的 Secret |
### 方式 B:旧版单 Key(兼容)
| 请求头 | 值 |
|--------|-----|
| `x-external-key` | 部署时配置的 external_api_key |
### 方式 C:用户 JWT(仅限插件)
| 请求头 | 值 |
|--------|-----|
| `Authorization` | `Bearer <JWT>`(来自 `POST /api/external/auth/login`) |
---
## 二、快速开始(Python / Node 示例)
@@ -324,9 +311,10 @@ GET /api/external/stats?server=
## 六、鉴权失败排查
1. **401 未授权**:检查 `x-api-client-id` / `x-api-secret` 是否与创建时一致;客户端是否被停用;secret 是否完整无换行空格
2. **客户端被停用**:后台「外部API」→ 启用。
3. **需要多个客户端**:后台可创建多个,分别用于机器人 / 插件 / 统计面板,互不影响;删除即立即失效
1. **401 缺少凭据**:请求必须携带 `x-api-client-id` `x-api-secret` 两个请求头
2. **401 客户端鉴权失败**:检查 Client ID / Secret 是否与创建时一致;secret 是否完整无换行空格;客户端是否被停用。
3. **客户端被停用**:后台「外部API」→ 启用
4. **需要多个客户端**:后台可创建多个,分别用于机器人 / 插件 / 统计面板,互不影响;删除即立即失效。
---