WordPress配置Google OAuth 2.0 oob重定向URI及scope不足问题排查
WordPress对接Google Analytics OAuth弹窗授权及API权限报错修复方案
问题根因
- 调用Analytics Admin API抛出
ACCESS_TOKEN_SCOPE_INSUFFICIENT错误,和OAuth客户端类型、Google Cloud后台API启用状态无关,核心问题是构造OAuth授权URL时传入的scope参数不全:现有代码的授权URL只传了https://www.googleapis.com/auth/analytics单个权限,既没带Analytics只读权限,也没带Admin API必需的管理类权限,用户授权环节授予的权限范围本身就不满足接口要求。后续初始化API客户端时哪怕写全了scope也无法生效——refresh_token对应的权限范围是用户点击授权确认那一刻就固定的,代码后续补加scope不会自动补全已有授权的权限。 - 此前授权流程跳转到其他页面、无法在弹窗内直接获取授权码的问题,是因为Web应用类型的OAuth客户端不支持
urn:ietf:wg:oauth:2.0:oob这个OOB回传地址,你新建桌面类型(已安装应用)客户端的方向是正确的,该类客户端原生支持这个回传地址,可实现弹窗内直接显示授权码的交互效果。 - 代码中添加的
openidscope属于OpenID账号登录场景的权限,和Analytics API调用无关,保留可能干扰权限授予流程,可直接移除。 - 代码中
setDeveloperKey配置的是API Key,仅用于不需要用户授权的公开接口调用,OAuth授权流程中不需要该配置。
分步修复方案
- 清除旧授权缓存
登录你用于授权的Google账号,进入第三方应用授权管理页面,找到当前对接用的桌面端OAuth客户端对应的授权条目,彻底移除授权,避免Google自动复用之前缺权限的旧授权记录。 - 修正授权URL参数配置
替换原有http_build_query段的代码,补全所有需要的scope,添加强制重新授权的参数,删除无效的自定义参数,修正后代码如下:
关键参数说明:$url = http_build_query( array( 'scope' => implode(' ', [ 'https://www.googleapis.com/auth/analytics', 'https://www.googleapis.com/auth/analytics.readonly', 'https://www.googleapis.com/auth/analytics.edit' ]), 'response_type' => 'code', 'redirect_uri' => 'urn:ietf:wg:oauth:2.0:oob', 'client_id' => '***', 'access_type' => 'offline', 'prompt' => 'consent' ) );- 全量scope必须和后续Google_Client中配置的scope完全一致,不能漏传
access_type=offline确保授权后可拿到长期有效的refresh_token,不需要用户重复授权prompt=consent强制弹出授权确认页,避免Google自动复用之前的旧授权- 原代码中无效的
next自定义参数直接删除,Google OAuth接口不识别该参数
- 精简授权逻辑代码
调整授权码交换token的代码段,移除无效配置,修正后代码如下:
注意:Analytics Admin API的if (isset($_POST["save_code"]) && isset($_POST["access_code"])) { $authCode = trim($_POST["access_code"]); $client = new Google_Client(); $client->setClientId('***'); $client->setClientSecret('***'); $client->setScopes([ 'https://www.googleapis.com/auth/analytics', 'https://www.googleapis.com/auth/analytics.readonly', 'https://www.googleapis.com/auth/analytics.edit' ]); $client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob'); $client->setAccessType('offline'); $client->setPrompt('consent'); $client->authenticate($authCode); $tokenData = $client->getAccessToken(); // 将拿到的refresh_token存入WordPress配置项,后续接口调用直接读取即可 update_option('wp_ga_custom_refresh_token', $tokenData['refresh_token']); }listAccountSummaries接口必须持有analytics.edit权限才能调用,这也是之前报错的核心诱因之一。 - 修正Admin API客户端初始化逻辑
不要手动拼接凭证配置,直接通过Google_Client实例生成的凭证初始化Admin客户端,避免配置不兼容问题,修正后代码如下:// 初始化基础Google客户端 $client = new Google_Client(); $client->setClientId('***'); $client->setClientSecret('***'); $client->setScopes([ 'https://www.googleapis.com/auth/analytics', 'https://www.googleapis.com/auth/analytics.readonly', 'https://www.googleapis.com/auth/analytics.edit' ]); $client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob'); $client->setAccessType('offline'); // 读取之前存储的refresh_token,自动刷新获取可用access_token $client->refreshToken(get_option('wp_ga_custom_refresh_token')); // 初始化Admin API客户端 $admin_client = new AnalyticsAdminServiceClient([ 'credentials' => $client->getCredentials() ]); $accounts = $admin_client->listAccountSummaries();
效果验证
- 重新点击授权按钮,弹窗内完成授权操作后,Google会直接在当前弹窗页面显示授权码,不会触发页面跳转,符合弹窗内取码的交互要求
- 用新获取的授权码交换得到refresh_token后,调用Admin API接口不会再出现权限不足的报错
- 后续接口调用会自动通过refresh_token刷新有效access_token,不需要用户重复走授权流程
内容的提问来源于stack exchange,提问作者Dipti Gajjar
相关产品推荐
相关产品推荐

