Shopify 安全与风控

轮换 client secret 后 webhook 验签全失败

现象#

在 Dev Dashboard 生成新 secret 并部署后,所有 webhook 都返回 401,日志里 HMAC 对不上,但旧 secret 明明还没撤销。

原因#

  • Shopify 用最早一个未撤销的 secret 签名,轮换期间仍走旧 secret
  • 代码只保留新 secret,旧签名一律拒绝,正好把真实 webhook 全挡掉
  • 提前 revoke 旧 secret 会让仍在用旧 secret 签名的投递瞬间失败
  • 多环境各存一份 secret,预发与生产不一致时验签结果随机

处理步骤#

  1. 在 Dev Dashboard 的 Credentials 页点 Rotate,先生成新 secret
  2. 验签代码同时接受新旧两个 secret,按 header 逐个尝试,任一通过即放行
  3. 把 OAuth、token exchange 与 refresh 全部切到新 secret,观察 24 小时失败率
  4. 确认没有旧签名流量后再 revoke 旧 secret,保留回滚窗口
  5. 用 shopify webhook trigger 发一条测试投递,核对 200 与签名结果

验收标准#

webhook 失败率为 0,日志显示轮换期新旧签名都通过,撤销旧 secret 后仅新签名通过。

本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。