为何Adsense Management API始终返回403权限拒绝错误?
尝试使用AdSense Management API获取数据,已完成以下操作:
- 创建项目并启用AdSense Management API
- 创建服务账户并生成密钥文件
通过以下代码生成访问令牌:
private async getToken() { const { google } = require("googleapis"); const path = Application.resourcesPath(`adsense.json`) const auth = new google.auth.GoogleAuth({ keyFile: path, scopes: 'https://www.googleapis.com/auth/adsense.readonly', }); let res = await auth.getAccessToken() .catch((err) => console.log("err...", err)); return res }
使用生成的令牌通过Postman向以下地址发送请求:
https://adsense.googleapis.com/v2/accounts/pub-xxxxxxxxxxxx/adclients
尝试了Bearer Token和OAuth2两种认证方式,均收到403权限错误:
{ "error": { "code": 403, "message": "The caller does not have permission", "status": "PERMISSION_DENIED" } }
给服务账户授权目标AdSense账户
服务账户默认没有访问AdSense账户的权限,需登录AdSense后台,将服务账户的邮箱(格式为xxx@xxx.iam.gserviceaccount.com)添加为账户授权用户,至少赋予只读权限。操作路径:AdSense后台 → 设置 → 访问和权限 → 添加用户,输入服务账户邮箱并选择权限级别。验证令牌的权限范围
确认生成令牌时指定的scopes为https://www.googleapis.com/auth/adsense.readonly,可通过JWT解析工具查看令牌包含的scopes是否正确,确保权限覆盖所需操作。检查请求的账户ID准确性
确认URL中的pub-xxxxxxxxxxxx是正确的AdSense账户ID,可在AdSense后台的账户信息中核对准确ID,避免输入错误。直接用Google客户端库发起请求
跳过手动传递令牌到Postman的步骤,用googleapis库直接调用API,减少令牌传递环节的问题。示例代码:const { google } = require("googleapis"); const path = Application.resourcesPath(`adsense.json`); async function getAdClients() { const auth = new google.auth.GoogleAuth({ keyFile: path, scopes: 'https://www.googleapis.com/auth/adsense.readonly', }); const adsense = google.adsense({ version: 'v2', auth }); try { const res = await adsense.accounts.adclients.list({ parent: 'accounts/pub-xxxxxxxxxxxx' }); console.log(res.data); } catch (err) { console.error('请求错误:', err); } }确认服务账户密钥文件有效性
检查adsense.json是否是从Google Cloud控制台下载的完整密钥文件,确保文件包含正确的client_email、private_key等字段,未被篡改。
内容的提问来源于stack exchange,提问作者Lambros Tampourlos

