PHP+CURL调用Google Search Console API认证配置求助
解决Google Search Console API认证问题(PHP+CURL)
核心说明
Google Search Console API不支持API Key认证,必须使用OAuth2凭证。你提到的本地私有Apache服务器场景,最适合用**服务账号(Service Account)**实现无用户交互的认证,完全替代需要用户手动授权的OAuth2流程。
前置准备步骤
给服务账号分配Search Console权限
- 打开Google Search Console,进入目标站点管理页面
- 点击「设置」→「用户和权限」→「添加用户」
- 输入你拿到的服务账号邮箱(
xxx@iam.gserviceaccount.com),至少分配「查看者」权限后保存
下载服务账号JSON密钥
- 回到Google Cloud控制台,进入「IAM与管理」→「服务账号」
- 找到目标服务账号,点击「密钥」→「添加密钥」→「创建新密钥」
- 选择「JSON」格式,下载密钥文件,保存到Apache服务器的安全目录(禁止公开访问)
方案1:使用Google官方PHP客户端库(推荐)
官方库会自动处理令牌生成和刷新,无需手动编写复杂的CURL逻辑:
require __DIR__ . '/vendor/autoload.php'; // 初始化客户端 $client = new Google\Client(); $client->setAuthConfig('/path/to/your-service-account-key.json'); $client->addScope('https://www.googleapis.com/auth/webmasters.readonly'); // 初始化Search Console服务 $service = new Google\Service\Webmasters($client); // 调用Search Analytics接口 $siteUrl = 'sites/example.com'; $request = new Google\Service\Webmasters\SearchAnalyticsQueryRequest(); $request->setStartDate('2024-01-01'); $request->setEndDate('2024-01-31'); $request->setDimensions(['date']); $response = $service->searchanalytics->query($siteUrl, $request); print_r($response);
方案2:原生CURL实现(手动生成JWT令牌)
如果不想依赖官方库,可手动生成JWT令牌并获取访问令牌:
步骤1:安装JWT依赖
使用Composer安装firebase/php-jwt:
composer require firebase/php-jwt
步骤2:PHP代码实现
use Firebase\JWT\JWT; // 读取服务账号密钥文件 $keyPath = '/path/to/your-service-account-key.json'; $keyData = json_decode(file_get_contents($keyPath), true); // 生成JWT令牌 $now = time(); $payload = [ 'iss' => $keyData['client_email'], 'sub' => $keyData['client_email'], 'aud' => 'https://oauth2.googleapis.com/token', 'iat' => $now, 'exp' => $now + 3600, // 令牌有效期1小时 'scope' => 'https://www.googleapis.com/auth/webmasters.readonly' ]; $jwt = JWT::encode($payload, $keyData['private_key'], 'RS256'); // 获取访问令牌 $tokenUrl = 'https://oauth2.googleapis.com/token'; $postData = http_build_query([ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', 'assertion' => $jwt ]); $ch = curl_init($tokenUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/x-www-form-urlencoded' ]); $tokenResponse = json_decode(curl_exec($ch), true); curl_close($ch); if (!isset($tokenResponse['access_token'])) { die('获取令牌失败:' . print_r($tokenResponse, true)); } $accessToken = $tokenResponse['access_token']; // 调用Search Analytics接口 $apiUrl = 'https://www.googleapis.com/webmasters/v3/sites/example.com/searchAnalytics/query'; $queryData = json_encode([ 'startDate' => '2024-01-01', 'endDate' => '2024-01-31', 'dimensions' => ['date'] ]); $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $queryData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Bearer ' . $accessToken ]); $apiResponse = json_decode(curl_exec($ch), true); curl_close($ch); print_r($apiResponse);
关键注意事项
- 服务账号必须被添加到Search Console的站点权限列表,否则会返回权限不足错误
- 服务账号的JSON密钥文件要妥善保管,禁止泄露到公共环境
- 访问令牌有效期为1小时,需在过期前重新生成(官方库会自动处理刷新)
内容的提问来源于stack exchange,提问作者mike_s
相关产品推荐
相关产品推荐

