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

调用Google Cloud Postmaster API返回空数组的问题排查

问题描述

已完成服务账号配置,编写了PHP脚本用于获取访问令牌并调用Gmail Postmaster Tools接口拉取域名列表,代码如下:

<?php

require_once 'JWT_1.php';
require_once 'JWT_KEY_1.php';

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$privateKey = <<<EOD
-----BEGIN PRIVATE KEY-----
someKey
-----END PRIVATE KEY-----
EOD;

$publicKey = <<<EOD
-----BEGIN PUBLIC KEY-----
someKey
-----END PUBLIC KEY-----
EOD;

$payload = array(
  "iss" => "myName@name.iam.gserviceaccount.com",
  "scope" => "https://www.googleapis.com/auth/postmaster.readonly",
  "aud" => "https://oauth2.googleapis.com/token",
  "exp" => (time() + 600),
  "iat" => time()
);

$jwt = JWT::encode($payload, $privateKey, 'RS256');

$urlToken = 'https://oauth2.googleapis.com/token';
$url = 'https://gmailpostmastertools.googleapis.com/v1/domains';

$payloadToken = array(
  "grant_type" => "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "assertion" => $jwt
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlToken);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadToken);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$tokenAnswer = json_decode(curl_exec($ch), true);
$token = $tokenAnswer['access_token'];
curl_close($ch);

$ch = curl_init();
$headers = array(
  'Authorization: Bearer ' . $token,
  'Accept: application/json'
);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING , "");
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
echo curl_exec($ch);

脚本调用接口时返回空数组,但同接口在API测试工具中可正常返回域名列表,常见原因如下:

  • 服务账号未获得Postmaster域名授权:Gmail Postmaster Tools的域名数据归属验证域名的个人/Workspace用户,不属于GCP项目或服务账号本身。必须在Postmaster Tools后台将对应服务账号的邮箱添加为目标域名的授权用户(至少只读权限),服务账号才能拉取到域名数据。API测试工具调用正常,基本都是因为测试时使用的是已获得授权的个人用户凭据,而非服务账号凭据。
  • cURL请求Token的参数格式错误:代码中向OAuth2 Token接口传参时直接传入PHP数组,cURL会默认将请求编码为multipart/form-data格式,但OAuth2接口要求参数必须为application/x-www-form-urlencoded格式。该问题会导致返回的访问令牌权限范围异常,最终接口返回空结果。修复方式为将POSTFIELDS配置改为curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payloadToken));。
  • Workspace场景下未配置域委派:如果服务账号属于Google Workspace组织,且未直接给服务账号授予Postmaster域名权限,需要先在GCP控制台给服务账号开启全域权限委派,同时在生成JWT的payload中增加sub字段,填写组织内已拥有Postmaster域名访问权限的用户邮箱,模拟该用户身份调用接口。
  • API未启用或权限配置不全:确认服务账号所属GCP项目已启用Gmail Postmaster Tools API,同时服务账号本身没有被组织策略限制调用该API。部分权限缺失场景不会直接返回403错误,会返回空数据集。
  • JWT签名异常:确认使用的Firebase JWT库版本兼容当前写法,私钥格式正确无转义问题,避免生成的JWT携带的身份信息无效,导致令牌权限不足。

排查优先级:先打印Token接口和业务接口的完整响应(包含响应头、错误字段)确认是否有隐藏报错,再修正cURL参数格式,之后核对Postmaster后台的服务账号授权状态,最后检查域委派和API启用配置。

内容的提问来源于stack exchange,提问作者Evgen Test

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:27:15