Asana 出站 Webhook 与握手
在 Asana 开发者控制台用具备资源访问权限的令牌,对项目或任务调用创建 Webhook:target 填网关对外 HTTPS 地址。创建请求发出后,Asana 会同步向你方 URL 发起一次握手 POST,请求头携带 X-Hook-Secret;你的服务必须在数秒内原样把同名响应头设回相同值并返回 200 或 204,握手成功后创建请求才会以 201 结束。务必异步处理:一边接住握手,一边别让创建 Webhook 的出站请求饿死。
- 步骤一 用
filters收窄到关心的task动作(例如changed且配合自定义栏位),降低噪声与后续 API 调用量。 - 步骤二 将握手得到的密钥写入仅网关可读的文件(权限参考 密钥最小权限),并与 webhook
gid、资源gid一并落库。 - 步骤三 对空
events的心跳包同样快速返回成功,避免 24 小时无响应被删订阅。
签名校验(X-Hook-Signature)
正式事件 POST 会带 X-Hook-Signature。按官方说明,用握手阶段保存的密钥对完整原始 body做 SHA256 HMAC,再与头中的签名做常量时间比较;不通过则返回 401 并打脱敏日志。常见坑是中间件先 JSON.parse 再 stringify 参与验签,键序或空格一变即失败。
- 步骤一 在 OpenClaw 路由最前读取字节流,禁止在验签前改写 body。
- 步骤二 验签通过后再解析
events;空数组直接结束。 - 步骤三 对同一批里重复的
resource.gid做短窗去抖,减轻「打字触发连发」类风暴。
OpenClaw 网关路由与入队
对外只暴露一台网关:TLS 终止、体大小限制、身份与路径路由都在这里完成。验签后将事件映射为队列消息(仓库、引用、任务链接、触发人、幂等键),持久化入队成功后再对 Asana 回包,避免平台重试造成双跑。执行面扩容只加消费者,路由与密钥面不变;拓扑对齐 多节点部署与队列同步。
- 步骤一 白名单触发条件(例如某「构建中」分栏),其余事件早返回。
- 步骤二 队列消息携带
provider_run_id(可用 webhook 投递 id 或事件哈希)以便跨节点去重。 - 步骤三 构建脚本在各节点相同入口执行,敏感段用 flock 或队列串行,日志带
mesh_node_id。
多节点通知模板
聊天与工单回写都应只经网关,避免四台 Mac 各发一条把频道刷爆。推荐模板字段:任务标题与链接、分支或标签、结论(成功 / 失败)、节点名、最后 N 行日志摘要、provider_run_id。失败时由网关调用 Asana REST 追加 Story 或评论;成功可只广播 IM。出站通道建议指数退避、抖动与有界重试,与入队侧同一套幂等键去重。
401 / 429 排错 FAQ
| 现象 | 排查要点 |
|---|---|
| 写回评论 401 | 令牌是否撤销、scope 是否含写任务、工作区是否匹配;构建节点是否误持写令牌。 |
| 验签失败类 401 | 是否用了重序列化后的 body;CDN 是否改体;是否混用多个 webhook 密钥。 |
| REST 429 | 合并同一任务的拉取与写回;指数退避与上限;网关层限流与 Asana 配额错峰。 |
| Webhook 被删 | 心跳未 200、连续 5xx 超窗,或握手未完成;查 last_failure_content 复核。 |
下一步
多节点套餐与公开购买
网关与队列跑通后,按并发与地域加节点;下单前可在购买页对比套餐与试用说明。