任何人都可以向你的 Webhook 地址发请求,所以在处理每次投递之前都要先校验。每次投递都用端点的签名密钥签过名,并带有两个请求头:
X-EmbodiFlow-Timestamp:Unix 秒。X-EmbodiFlow-Signature:v1=<hex>。轮换密钥期间会包含多个以逗号分隔的值,任意一个匹配即可接受。
校验
校验签名分三步:
- 构造被签名的字符串:时间戳、一个点、再加原始请求体字节,即
timestamp + "." + body。请求体必须原样使用,不要解析后再重新序列化 JSON。 - 用你的签名密钥计算这个字符串的 HMAC-SHA256,并以常量时间比较十六进制摘要。
- 拒绝与你的时钟相差超过 300 秒的时间戳,这样旧的投递就无法被拿来重放。
完整示例
可以用它来测试你的代码。密钥为 whsec_example_do_not_use,时间戳为 1710000000,请求体如下:
{"id":"c0a1e014-8000-5111-8148-000000000001","type":"workflow.run.succeeded","specVersion":1,"occurredAt":"2024-03-09T16:00:00.000Z","tenantId":"01900000-0000-7000-8000-000000000001","projectId":"01900000-0000-7000-8000-000000000002","resource":{"type":"workflow_run","id":"01900000-0000-7000-8000-000000000003"},"data":{"workflowRunId":"01900000-0000-7000-8000-000000000003","status":"succeeded"}}你的代码算出的 HMAC-SHA256 十六进制值应为 db77a488491b575ab3bc5d1f305065bba69ec10e9ac893a10c8c94adc58a14bf。