# apps openapi-key 命令族 SOP 管理妙搭应用对外暴露的 HTTP API Key(`/openapi/**` 鉴权凭证)。全部操作需 `--as user`(AuthType: user)。`--help` 是参数细节的完整来源;本文件只记录 Agent 不看就会做错的领域规则。 ## 命令路由 | 命令 | 用途 | |---|---| | `+openapi-key-list` | 列出应用所有 API Key(脱敏) | | `+openapi-key-get` | 查看单个 Key 详情(脱敏) | | `+openapi-key-create` | 创建新 Key,**原始密钥一次性可见** | | `+openapi-key-update` | 改名或改 config(不改 status) | | `+openapi-key-enable` | 启用 Key(status→1) | | `+openapi-key-disable` | 停用 Key(status→0),**泄露/疑似泄露优先用这个而非 delete** | | `+openapi-key-delete` | 永久删除 Key(不可逆) | | `+openapi-key-reset` | 轮换密钥(刷新原始 Key),**一次性可见** | ## 脱敏口径(安全关键) - `list` / `get` / `update` / `enable` / `disable`:返回结构里 **无** `api_key` 字段,只有 `key_preview`(格式:`****` + 原始密钥末 4 位,如 `****5f4a`)。 - `create` / `reset`:**仅** 在 `data.api_key`(顶层)返回原始密钥一次;同时在 stderr 打印一次性提示: ``` warning: this api_key is shown only once and is NOT stored by lark-cli — copy it now and store it in your own secret manager. ``` - 原始密钥绝不写入 cache / config / recent / debug log / 错误信息。 ## 一次性密钥语义 CLI 不保存原始密钥。密钥在 `create` / `reset` 时仅随响应返回一次。**密钥丢失不能用 `get` 找回**——唯一恢复方式是 `+openapi-key-reset` 重新生成新密钥(旧密钥同时失效)。 ## scope 结构与 CLI 表达 后端 `config.request_scope` 的真实结构(**snake_case**——Lark 开放网关 `/open-apis/` 对外契约约定;`api_key.thrift` 的 camelCase go.tag 是内部表示,OGW 已转成 snake_case): ```json { "allow_all": true, "http_infos": [ { "http_method": "GET", "http_path": "/openapi/some-path" } ] } ``` - `allow_all=true`:放开该应用所有 `/openapi/**` 路由;`http_infos` 此时忽略。 - `allow_all=false`:按 `http_infos` 逐条授权,每条需 `http_method`(大写)+ `http_path`(`/openapi/` 开头)。 CLI 提供三种互斥的 scope 表达方式: | flag | 用途 | 备注 | |---|---|---| | `--scope-all` | `allow_all=true`,放开所有路由 | bool flag,显式传 `--scope-all=false` 也算"已设置" | | `--scope-api 'METHOD /openapi/path'` | 逐条授权一个路由,可重复 | 路由从应用 `docs/openapi.json` 取 | | `--scope ''` | 高级逃生口,直传 request_scope JSON(snake_case) | CLI 只校验合法 JSON;`--scope` 与 `--scope-all`/`--scope-api` 互斥 | ### scope 值来源 妙搭应用的 `/openapi/**` 路由定义在应用仓库,并同步维护在 `docs/openapi.json`(`paths` 下每个 `"/openapi/..."` 条目 + HTTP 方法)。要授权哪些路由,读目标应用自己的 `docs/openapi.json`,取 `(method, path)` 对。CLI 本身不提供 API 路由发现功能(P1 规划中)。 ## 高风险操作 `delete` 和 `reset` 是高风险(`high-risk-write`),有以下约束: - 需显式传 `--yes`(框架 `cmdutil.RequireConfirmation`);缺少时退出码 10,**不要自动补 `--yes`**(遵循 lark-shared 安全红线)。 - 支持 `--dry-run` 查看将要执行的 HTTP 请求(不含密钥);不确定时先 dry-run。 - **泄露场景**:应优先 `+openapi-key-disable` 立即停用,而非 `+openapi-key-delete`——停用可随时 enable 恢复,delete 不可逆。 ## 典型决策场景 | 用户意图 | 正确操作 | |---|---| | "key 泄露了,先停掉" | `+openapi-key-disable`(不是 delete) | | "key 丢了/忘了,再给我一个" | `+openapi-key-reset`(不是 create 新 key;reset 轮换密钥、保留原 key 配置) | | "我的 key 密钥是什么" | 解释:list/get 不回显原始密钥,只能用 `+openapi-key-reset` 轮换 | | "给应用创建一个有权限限制的 key" | `+openapi-key-create --name ... --scope-api 'GET /openapi/...'`(路由取自应用 `docs/openapi.json`) | ## 不在本 skill 范围 - OpenAPI spec 全量导出、实时日志 tail、Webhook 消费、多鉴权方式:本期不支持。 - 身份选择、权限不足处理(`missing_scopes`→`console_url`)、exit-10 审批、通用"禁输出密钥"红线、高风险操作通用框架:见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md),不在此重复。