You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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回传地址,你新建桌面类型(已安装应用)客户端的方向是正确的,该类客户端原生支持这个回传地址,可实现弹窗内直接显示授权码的交互效果。
  • 代码中添加的openid scope属于OpenID账号登录场景的权限,和Analytics API调用无关,保留可能干扰权限授予流程,可直接移除。
  • 代码中setDeveloperKey配置的是API Key,仅用于不需要用户授权的公开接口调用,OAuth授权流程中不需要该配置。

分步修复方案

  1. 清除旧授权缓存
    登录你用于授权的Google账号,进入第三方应用授权管理页面,找到当前对接用的桌面端OAuth客户端对应的授权条目,彻底移除授权,避免Google自动复用之前缺权限的旧授权记录。
  2. 修正授权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接口不识别该参数
  3. 精简授权逻辑代码
    调整授权码交换token的代码段,移除无效配置,修正后代码如下:
    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']);
    }
    
    注意:Analytics Admin API的listAccountSummaries接口必须持有analytics.edit权限才能调用,这也是之前报错的核心诱因之一。
  4. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:45:40