GitHub App 一键安装:manifest 建 App、安装记录、双 secret 验签、/fix-review 内容去重

This commit is contained in:
host committed 2026-10-26 16:02:45 +08:00
1 parent ecf4b5c715
commit 32059178bd
5 files changed
+1210 -14

No files matched your search

+39
View File
@@ -159,6 +159,45 @@ client_secret(只走环境变量),不是无认证后门。
没有返回 404)后恢复原来的 oauth 账号登录。查看自己的绑定:
`GET /oauth/{provider}/bindings`(须持本站 key,只看得到自己的)。
### GitHub App 一键安装(已实现安装一半;App-token API 动作未做)
目标:把手动建 webhook(填 URL、secret、选事件)变成“点一下
安装”。流程用 GitHub manifest 流程(GitHub 文档标准流程):
1. 操作方持本站 key 调 `POST /github-app/setup/state`(body 可含
org),返回 `{state, setup_url}`;要求环境变量
`GITHUB_APP_PUBLIC_BASE`(公网域名,如 `https://api.diante.me`,
manifest 里的 hook / 回调地址都由它拼出)。
2. 用户打开 setup_url:表单页含 manifest JSON(App 名默认
`codex-app-server`,可由 `GITHUB_APP_NAME` / `GITHUB_APP_URL`
改;权限 contents:write、pull_requests:write、issues:read,
事件 issue_comment、pull_request;默认私有 App,只有所有者
能安装,`GITHUB_APP_PUBLIC=1` 可翻成公开)与 state,点提交
到 GitHub 建 App 页(个人账号 `/settings/apps/new`,组织账号
`/organizations/{org}/settings/apps/new`),用户确认 Create。
3. GitHub 跳回 `GET /github-app/callback?code=...&state=...`:
server 验 setup state(一次性、1 小时过期,manifest code 同样
1 小时内有效)→ POST
`api.github.com/app-manifests/{code}/conversions` 换回 id、slug、
webhook_secret、pem → 存库里 `github_app_config` 表(单行)。
成功页只显示 App 身份与安装链接
`https://github.com/apps/<slug>/installations/new`,绝不显示
webhook_secret 与 pem。
4. 用户点安装:installation 事件到 `/webhooks/github`,记
`github_app_installations` 表(created/added 增行、removed 减
行、deleted 清安装),`GET /github-app/status`(须持本站 key)
可查配置与安装列表,同样不含 secret/pem。
验签与去重:webhook 验签同时接受 App secret(库里)与 env 里
`GITHUB_WEBHOOK_SECRET`(手动 webhook,过渡期共存);App 装好
后应删掉手动 webhook,避免同一事件送两遍;即使共存,
/fix-review 也有内容去重(repo + PR + 评论 id,
`github_fix_review_dedup` 表),只建一次任务。
诚实边界:pem 虽然存下来了,但本阶段不用它签 JWT、不用它换
installation token;推分支、建 PR 仍走 gh + PAT(见“云端派发与
自动 PR”),App-token API 动作是下一阶段。
### 推送凭证清单
- webhook / slack:需要可注入 sender(worker 侧),HTTP 层没有