验证Codex Webhook签名需先提取X-Codex-Signature和X-Codex-Timestamp,构造t={timestamp}\n{body}原始消息,用HMAC-SHA256密钥计算签名并恒定时间比对,且时间戳须在当前±300秒内。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

验证Codex Webhook请求的签名,是为了确认该请求确实来自Codex服务器而非伪造,避免恶意第三方冒充触发业务逻辑。你必须在收到HTTP请求后、处理业务前完成签名校验,否则将面临未授权操作风险。
获取请求头中的签名和时间戳
从HTTP请求头中提取 X-Codex-Signature 和 X-Codex-Timestamp 两个字段。前者是HMAC-SHA256生成的十六进制签名字符串,后者是Unix秒级时间戳(如 1717023456)。若任一字段缺失或格式非法,直接拒绝请求。
注意:Codex不会发送 X-Codex-Signature-256 或其他变体头,只用 X-Codex-Signature 这一个签名头。
构造待签名原始消息
将时间戳字符串与原始请求体(raw body)按 t={timestamp}\n{body} 格式拼接,中间用换行符(\n)连接,不加空格、不加BOM、不进行URL编码。例如时间戳为 1717023456,body为 {"event":"user.created"},则原始消息为:
t=1717023456\n{"event":"user.created"}
⚠️ 关键点:必须使用原始未解析的body字节流,不能用JSON.parse后再stringify——这会改变空格、换行、转义顺序,导致签名不匹配。
通过本地 Codex 或 OpenClaw OAuth 凭证直接调用 ChatGPT/Codex Responses 的 image_generation 工具来生成或编辑光栅图像,然后保存
用密钥计算预期签名
方法一:使用HMAC-SHA256算法,以你在Codex控制台配置的Webhook密钥(secret)为key,上一步拼接出的原始消息为message,计算HMAC值。
方法二:输出为十六进制小写字符串,长度固定为64位(32字节→64字符)。Python示例:hmac.new(secret.encode(), msg.encode(), hashlib.sha256).hexdigest();Node.js示例:crypto.createHmac('sha256', secret).update(msg).digest('hex')。
如果你用的是base64密钥,请先base64解码再参与HMAC计算——Codex后台使用的密钥是原始字节,不是base64字符串本身。
比对签名并验证时效性
第一步:检查 X-Codex-Timestamp 是否为有效整数,且与当前时间相差不超过5分钟(300秒)。Codex强制要求请求在发出后5分钟内被接收,超时即拒收。
第二步:将计算出的预期签名字符串与请求头中 X-Codex-Signature 的值进行恒定时间比对(constant-time compare),防止时序攻击。不要用 == 或 === 直接比较。
第三步:若时间有效且签名一致,校验通过;任一失败,立即返回HTTP 401或400,不执行后续业务逻辑。

















