Origin Webhook 验签与恢复
验证原始 body 的 Ed25519 摘要签名,处理重复投递、暂停和七天恢复窗口。
Origin 向应用 HTTPS webhook URL POST JSON,at-least-once 交付。持久接收后快速返回 2xx,异步处理;webhook-id 是重试间稳定的去重键,event.id 标识底层业务事件。
验签顺序
保留未解析 raw body,以 webhook-id、webhook-timestamp 和正文构造:
lowercaseHex(SHA-256("<webhook-id>.<webhook-timestamp>.<raw-request-body>"))用 Origin JWKS 的 active Ed25519 keys 验证这个十六进制 digest 的 UTF-8 字节。签名 header 为 v1ed,BASE64_SIGNATURE,不含 kid,需要尝试 active keys;时间与当前相差超过五分钟拒绝。
虽然 header 名类似 Standard Webhooks,该协议签的是 SHA-256 digest 且使用自定义 v1ed 标签,不能直接套标准库的默认算法。先验签,再以 body 为权威读取 appId、installationId 和 event;routing headers 只是便利信息。
超时与重试
每次等待 response headers 最多 10 秒,包含 DNS、连接、TLS 和应用处理。transport error、429、5xx 最多合计七次尝试;其他 4xx 终止。
六次重试依次等待 5 秒、30 秒、1 分钟、2 分钟、4 分钟、8 分钟,约 16 分钟内完成全部失败轮次。每次保持相同 webhook-id,必须幂等处理。
暂停与自动禁用
owner 可暂停投递。若 72 小时内至少 20 个 delivery rounds 失败、期间没有成功且涉及超过一个 installer namespace,系统也会禁用;需 owner 恢复后才继续。
暂停时 batchRedeliver 返回 FailedPrecondition/400 且不入队,API 暂无单独 paused field。清空 webhookUrl 是另一操作,会取消 pending deliveries,后来恢复 URL 不会带回它们。
恢复窗口
用 app JWT GET /app/webhook/deliveries 查询,delivered=false 返回从未获得 2xx 的投递,记录可查七天。POST /app/webhook/deliveries:batchRedeliver 每次最多 100 IDs,自动去重并逐项返回结果。
新接收器可先 Ping Webhook。收到镜像仓库事件不扩大 installation 的 API 权限,仍需按应用认证的镜像范围处理。