Shopware API认证异常:有效凭证仍提示用户凭据错误,求排查方案
Shopware API认证失败排查求助
环境背景
- 客户生产/预发布环境:Shopware 6.2.3,计划升级至6.4.x版本
- 测试环境:全新安装的6.4.13.0,用于插件功能测试
问题现象
- 生产环境副本升级至6.4.13.0后,API调用始终返回400错误:
{"errors":[{"code":"6","status":"400","title":"The user credentials were incorrect.","detail":null}]}
已确认凭证可正常登录后台,但相同Payload的Curl命令、自研代码调用API均失败;相同命令/代码在全新6.4.13.0开发环境可正常获取access token。 - 未升级的6.2.3生产/预发布环境测试API调用,同样报错,状态码为401(升级后变为400)。
测试用Curl命令
curl --request POST --url https://our-domain.example/api/oauth/token --header 'Authorization: ' --header 'Content-Type: application/json' --data '{"grant_type": "password", "username": "xxxxx", "password": "xxxxxxxx", "client_id": "administration"}'
自研代码片段
private function _getToken($domain, $username, $pass) { if ($domain[strlen($domain)-1] !== "/") { $domain .= "/"; } $endpoint = $domain . "api/oauth/token"; $config = []; if (strpos($endpoint, "https") > -1) { $config = ['verify' => false]; } $client = new Client($config); $json_encode = json_encode([ 'username' => $username, 'password' => $pass, 'grant_type' => 'password', "client_id" => "administration", ]); $response = $client->request('POST', $endpoint, [ 'body' => $json_encode, "headers" => ["Content-Type" => "application/json"] ]); return json_decode($response->getBody())->access_token; }
排查方向与解决方案
1. OAuth客户端配置校验
- 检查数据库表
oauth_client中,client_id为administration的记录是否存在:- 确认
allowed_grant_types字段包含password授权类型(6.4.x版本对授权类型校验更严格) - 核对
secret字段值,升级过程中可能出现配置丢失或篡改,全新6.4环境中该字段默认空值
- 确认
- 若记录缺失,可通过执行
bin/console oauth:create-client --grant-type=password --id=administration重新创建客户端
2. 用户权限与状态检查
- 登录后台确认该用户已开启API访问权限:路径为「设置 > 用户与权限 > 用户 > 编辑目标用户 > 权限标签页」,需勾选"允许API访问"
- 检查数据库
user表,确认目标用户的active字段为1、locked字段为0,避免用户被锁定或禁用
3. 升级后配置差异排查
- 对比生产升级环境与全新6.4.13.0环境的
system_config表,重点检查api.auth.enabled配置项是否为true - 临时禁用所有第三方插件后重新测试,排查是否有安全类插件拦截了OAuth端点的请求
- 检查
config/packages/shopware.yaml中的API相关配置,确保api模块未被禁用
4. 请求参数细节修正
- 移除Curl命令中
Authorization:这个空请求头,避免干扰认证逻辑 - 针对6.2.3版本,尝试在Payload中添加
"client_secret": ""参数(早期版本对该字段有隐性校验) - 检查密码是否包含特殊字符,确认
json_encode是否正确处理,可直接在Curl中使用原始密码测试排除编码问题
5. 6.2.x版本专属排查点
- 执行
bin/console debug:router命令,确认/api/oauth/token路由存在且配置正确 - 检查6.2.3环境的API防火墙配置,确认
api区域允许password授权类型的请求
内容的提问来源于stack exchange,提问作者Yutani
相关产品推荐
相关产品推荐

