Laravel部署Shopify应用报Missing Authorization key错误排查
该报错和iframe嵌入场景无关,核心是请求到达Shopify SDK前,Authorization鉴权头被Web服务器、框架层拦截或格式不匹配,导致SDK无法读取到已携带的Bearer令牌。本地开发时Vite/PHP内置服务器默认会透传所有头,所以不会出现该问题,部署到生产环境后Web服务器默认配置会丢弃该头。
1. 配置Web服务器透传Authorization头
这是该场景下最高发的问题,PHP-FPM默认不会主动把Authorization头传递给上层PHP应用,需要手动修改Web服务器配置:
- Nginx环境:在站点对应的fastcgi配置段新增两行参数传递规则:
# 原有fastcgi配置保留,新增以下两行 fastcgi_param HTTP_AUTHORIZATION $http_authorization; fastcgi_param Authorization $http_authorization;
修改后执行nginx -t校验配置无语法错误,执行systemctl reload nginx重载配置生效。
- Apache环境:在站点配置文件或项目public目录下的
.htaccess中添加重写规则:
RewriteEngine On RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
修改完成后重启Apache服务即可。
2. 配置Laravel信任代理
AWS部署如果使用了ALB负载均衡、CloudFront CDN这类反向代理,Laravel默认不信任代理来源的请求头,会自动过滤Authorization等非标准头。修改app/Http/Middleware/TrustProxies.php文件:
// 信任所有代理IP,AWS生产环境直接使用该配置即可 protected $proxies = '*'; // 适配AWS负载均衡的转发头格式 protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB;
3. 兼容SDK头键名匹配规则
Shopify PHP SDK读取头时匹配首字母大写的Authorization键名,而Laravel基于Symfony实现的Request对象,header()方法返回的数组默认使用全小写键名,会导致SDK匹配失败。
在调用SDK方法前手动补全对应键值即可:
$requestHeaders = $request->header(); // 补全SDK识别的大写键名头 if (isset($requestHeaders['authorization'])) { $requestHeaders['Authorization'] = $requestHeaders['authorization'][0]; } $session = Utils::loadCurrentSession($requestHeaders, $request->cookie(), $isOnline);
4. 排除CSRF中间件拦截
如果你的API路由被错误归入web中间件组,Laravel默认的CSRF校验中间件会拦截未携带CSRF令牌的请求,导致鉴权头无法到达业务逻辑。
确认所有/api前缀的路由都位于routes/api.php文件中,或在app/Http/Middleware/VerifyCsrfToken.php的排除列表中添加API路径:
protected $except = [ '/api/*', ];
配置完成后,在调用loadCurrentSession前打印$request->header('Authorization'),如果能正常返回Bearer <令牌内容>格式的字符串,接口即可正常响应,不会再抛出缺失头的异常。
内容的提问来源于stack exchange,提问作者KCP

