Storefront API 两个令牌头写反了返回 401 怎么区分
现象#
服务端日志里请求带的是 Authorization: Bearer xxx 或 X-Shopify-Access-Token,Storefront 端点回 401 [API] Invalid API key or access token;换成私有令牌能通,但一上线就出现结账掉登录。
原因#
- Storefront 只有两个头:公开令牌走 X-Shopify-Storefront-Access-Token,私有令牌走 Shopify-Storefront-Private-Token,都不认 Bearer
- 私有令牌只允许服务端使用,出现在浏览器里等于把可写购物车的凭证公开,也会失去按买家 IP 做的保护
- 服务端用私有令牌处理买家流量却不带 Shopify-Storefront-Buyer-IP,Shopify 会把所有请求视为同一个买家
- 头名本身大小写不敏感,但 Buyer-IP 的取值必须是真实公网地址,反代后拿到 127.0.0.1 等于没传
处理步骤#
- 在请求封装里打印实际发出的 header 名(不要打印值),确认公开场景用的是
X-Shopify-Storefront-Access-Token - 浏览器端只保留公开令牌,变量名加
PUBLIC_前缀,构建时确认没有把私有令牌打进 bundle - 服务端改用
Shopify-Storefront-Private-Token,并从x-forwarded-for取第一个 IP - 补上
Shopify-Storefront-Buyer-IP头,检查反代没有把它覆盖成内网地址 - 用 curl 分别带两种头请求,记录状态码与
errors[0].extensions.code
验收标准#
公开令牌在浏览器 Network 里可见且返回 200;私有令牌只在服务端出现,买家 IP 头为公网地址,打开 checkoutUrl 后仍保持登录态。
本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。