敏感接口
“敏感接口”通常指对高风险 Open API(如群发、广播、批量导入、内容发布)做额外的审批、白名单或独立配额。本项目的自托管控制台没有按接口的敏感标记/审批流;可用替代手段是接口级限流、服务开通、回调同步拦截与敏感词。
概念
| 需求 | 当前可用的真实能力 | 缺口 |
|---|---|---|
| 限制某接口调用频率 | 「接口调频」per-operation QPS,超限 429/1008 | 无按角色的接口配额 |
| 关闭高风险能力 | 「服务开通」8 个 ServiceKey | 无接口级开关 |
| 发送前人工/风控审批 | CB01 同步回调 message.publish.before,可 pass/replace/block | 无通用 HTTP 审批中间件 |
| 内容过滤 | 敏感词 block/replace | 无图片/音视频审核模型 |
| 调用者身份限制 | RBAC 子账号(控制台管理面) | Open API 无 per-key 权限细分 |
- Open API 鉴权只有 AppKey 签名,没有按接口的 scope;任何持有 AppSecret 的调用方都能调全部已开通接口。
- 控制台的 RBAC 只约束
/api/admin/**,不约束 Open API。 - 需要“敏感接口”治理时,建议在应用服务器前置一层网关做鉴权、审批与限流。
未实现,不伪造入口
控制台没有“敏感接口”配置页或 admin 接口;本页只说明现有替代控制,避免按不存在的端点接入。
前置条件
- 服务端已启动(默认
http://127.0.0.1:8080),控制台入口http://127.0.0.1:8080/console/#ratelimit(tab#ratelimit:接口调频)。 - 请求头
X-Admin-Secret与服务端IM_ADMIN_SECRET一致(本地默认dev-admin)。 - 已在控制台选中应用;带
{appkey}的接口都按应用隔离。 - 自托管版无购买、计费、套餐、续费与发票流程(不适用项);本页只覆盖配置、查询与治理接口。
步骤
- 盘点高风险接口
如
message.broadcast、message.system.publish、user.batch.get、group.import。 - 配置接口限流
在「接口调频」为这些 operation 设置较低 QPS,超限返回 429 + Retry-After。
- 叠加发送前拦截
启用回调同步决策,应用服务器对高风险发送返回 block。
- 网关层补权限
在自有网关按调用方/场景做接口白名单;不要依赖不存在的服务端 scope。
参数表
| 替代能力 | 方法与路径 | 说明 |
|---|---|---|
| 接口限流 | POST /api/admin/apps/{appkey}/ratelimit | {overrides:{operationId:qps}} |
| 服务开关 | POST /api/admin/apps/{appkey}/services | 关闭整类能力 |
| 同步回调 | POST /api/admin/apps/{appkey}/callbacks | syncEnabled/syncTimeoutMs/syncDefaultAction |
| 敏感词 | POST /api/admin/apps/{appkey}/sensitive-words | {words,action} |
示例
给广播接口单独限流
Shell
curl -sS -X POST "http://127.0.0.1:8080/api/admin/apps/demo/ratelimit" \
-H 'X-Admin-Secret: dev-admin' \
-H 'content-type: application/json' \
-d '{"overrides":{"message.broadcast":1,"message.system.publish":5}}'
curl -sS -X GET "http://127.0.0.1:8080/api/admin/apps/demo/ratelimit" \
-H 'X-Admin-Secret: dev-admin'启用同步回调做发送前拦截
Shell
curl -sS -X POST "http://127.0.0.1:8080/api/admin/apps/demo/callbacks" \
-H 'X-Admin-Secret: dev-admin' \
-H 'content-type: application/json' \
-d '{"enabled":true,"url":"https://example.com/im/callback","events":["message.publish.before"],"syncEnabled":true,"syncTimeoutMs":500,"syncDefaultAction":"block"}'常见问题
有没有接口级白名单?
没有。Open API 签名密钥是应用级;请用网关或应用服务器做调用方鉴权。
限流能按用户吗?
不能。限流键是 (appkey, operationId) 的 1 秒滑动窗口。
同步回调能拦所有消息吗?
配置 message.publish.before 并启用 syncEnabled 后,消息投递前会等待应用决策或超时。
以后会加敏感接口页吗?
当前未排期;本页不会为未实现能力提供假端点。