同一个Bearer Token有时正常、有时提示The consumer isn’t authorized。若请求在多节点间轮询,优先比较app/etc/env.php里的crypt/key和OAuth配置;节点密钥不一致时,加密数据无法互认。

复现与判断

我保留了一个失败样本,并用同样输入在无缓存或单节点条件下再跑一遍。这样可以把前端假象、缓存和真正的数据问题分开。

数据库和日志对照

  • 在负载均衡器临时固定到单节点复测。
  • 比较配置文件校验和,不要把密钥内容打印进聊天或工单。
sha256sum app/etc/env.php
bin/magento config:show oauth/access_token_lifetime/customer
curl -I https://shop.example.com/rest/V1/customers/me -H "Authorization: Bearer REDACTED"

为了避免把环境差异当成根因,我会先在预发布或数据库副本复现;涉及订单、库存和支付的操作,正式环境只做只读核对,修复脚本必须带明确的订单号或SKU范围。

这次的修法

从可信部署源把同一crypt/key安全分发到全部节点,权限设为部署用户可读,不进公开仓库。清理生成配置并滚动重启PHP-FPM。密钥曾漂移期间生成的Token应统一吊销或让用户重新登录;不要同时保留两套未知密钥尝试解密。

修改范围

  • 先在单个SKU、单个订单或单个Store验证。
  • 保留可回退的旧配置,不覆盖原始证据。
  • 需要批量处理时分批提交并输出成功/失败清单。

验证结果

  • 同一Token连续经过所有节点均成功
  • 新旧节点校验和一致
  • 滚动发布后Token不随机失效
  • 日志不再出现decrypt/authorization交替错误

验收不只看后台提示“成功”。我还会从前台/API再走一次真实链路,并在下一轮cron、索引或缓存命中后重复检查,确认不是短暂正常。

顺手记下

更换crypt/key还会影响已加密配置值,操作前必须确认备份和影响范围。

如果线上数据已经不一致,先停掉会继续扩大差异的入口,再修历史数据;否则一边补一边写,最后很难判断哪些记录已经处理。