Magento 2+GraphQL接口报错:仅允许登录客户请求
针对EC2 Apache2服务器上生成Bearer Token后调用customerCart等API提示“The request is allowed for logged in customer”的问题,可按以下步骤排查:
检查请求头传递格式
确认请求的Authorization头严格遵循Bearer <token>格式(注意Bearer与令牌间的空格)。在Magento入口文件pub/index.php中添加var_dump($_SERVER['HTTP_AUTHORIZATION']); exit;,发起请求后查看服务器是否正确接收到完整的授权头——部分Apache配置会修改或截断这类请求头,比如自动转为HTTP_AUTHORIZATION字段,若未获取到则需检查Apache的头处理规则。验证Token的有效性与关联客户
登录数据库查看oauth_token表:- 确认目标token对应的
customer_id不为空(说明是客户令牌,而非访客令牌); - 检查
expires_at是否未过期,revoked字段为0(未吊销)。
若生成的令牌未关联客户ID,需重新确认生成Token的请求是否使用了正确的客户账号密码(访客令牌无法调用客户专属API)。
- 确认目标token对应的
核对Apache重写与.htaccess配置
- 确保Apache已启用
mod_rewrite模块(执行a2enmod rewrite并重启服务); - 确认站点根目录的
AllowOverride设置为All(在Apache虚拟主机配置中),否则.htaccess中的Magento重写规则无法生效; - 对比Plesk服务器的
.htaccess文件,确保EC2上的文件未被修改,尤其是GraphQL路径(默认/graphql)的重写规则。
- 确保Apache已启用
排查Apache安全模块干扰
若启用了mod_security等安全模块,临时禁用后测试请求——这类模块可能拦截Authorization头或触发误判。禁用后问题解决的话,需调整安全规则允许该头的正常传递。确认Magento基础URL配置
登录Magento后台,检查Stores -> Configuration -> General -> Web中的Base URL和Secure Base URL是否与EC2服务器的域名/IP一致;同时确认Allowed Hosts列表已添加当前服务器的域名,避免因域名不匹配导致Token验证逻辑异常。测试服务器内部请求
在EC2服务器上执行curl命令直接发起请求,示例:curl -X POST https://your-ec2-domain/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <your-valid-token>" \ -d '{"query": "{ customerCart { id } }"}'若内部请求正常,说明问题出在外部请求的转发/代理环节;若仍报错,则聚焦服务器本地配置。
清理Magento缓存与索引
执行以下命令清理缓存并重建索引:bin/magento cache:flush bin/magento indexer:reindex缓存残留可能导致配置未及时生效,尤其是跨服务器部署后的缓存不一致问题。
开启调试日志排查细节
在app/etc/env.php中开启调试日志:'dev' => [ 'log' => [ 'debug' => true, ] ]重新发起请求后查看
var/log/debug.log,查找OAuth令牌验证相关的日志条目,这类日志可能包含未在常规错误日志中记录的验证失败原因。
内容的提问来源于stack exchange,提问作者Sreejith A C

