使用Google Postmaster API服务账号连接时遇403权限问题求助
我正尝试通过以下NuGet包搭建Google服务器到服务器的连接:
Google.Apis.Auth.OAuth2Google.Apis.ServicesGoogle.Apis.PostmasterTools.v1
由于是服务器到服务器连接,我选用Service Account(服务账号)方案。
以下是我的代码,最后一行执行失败:
var credential = GoogleCredential.FromFile("path\\to\\file\\boreal-dock-34534534534.json") .CreateScoped(new[] { "https://www.googleapis.com/auth/postmaster.readonly" }); // Google.Apis.PostmasterTools.v1.PostmasterToolsService. var service = new PostmasterToolsService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "C9Transact", }); ListTrafficStatsResponse response = await service.Domains.TrafficStats.List("domains/domain.com").ExecuteAsync();
错误信息:
The service gmailpostmastertools has thrown an exception. HttpStatusCode is Forbidden. The caller does not have permission
错误详情:
{ "error": { "code": 403, "message": "The caller does not have permission", "errors": [ { "message": "The caller does not have permission", "domain": "global", "reason": "forbidden" } ], "status": "PERMISSION_DENIED" } }
我已完成的配置:
- 为服务账号主体分配了Editor、Service Account Token Creator、Service Account User角色;
- 已生成密钥并下载JSON文件用于代码中,凭证部分似乎正常;
- 已登录管理控制台添加Domain-wide Delegation(全域授权):Security -> Access and data control -> API Controls -> Domain-wide Delegation,添加了服务账号的Client ID及scope
https://www.googleapis.com/auth/postmaster.readonly; - 使用的域名
domains/????.com已在Google Postmaster页面验证。
但仍收到权限缺失错误,请问问题出在哪里?
问题排查与解决方法
核心问题:服务账号未获得Postmaster Tools域名授权
域名在Postmaster Tools验证后,还需要单独给服务账号授权访问该域名:- 登录Google Postmaster Tools,找到已验证的目标域名
- 进入域名的「设置」页面,添加服务账号的邮箱(格式:
[服务账号ID]@[Google Cloud项目ID].iam.gserviceaccount.com)为该域名的管理员
全域授权配置无效(非Google Workspace场景)
Domain-wide Delegation仅适用于Google Workspace(原G Suite)域名。如果你的域名是普通公共域名,这个配置完全没用,直接忽略即可,重点完成上面的Postmaster Tools域名授权。冗余角色清理
给服务账号分配Editor等Cloud项目角色是多余的,Postmaster Tools的权限控制不在Cloud项目层面。建议移除这些冗余角色,避免权限混乱。代码参数校验
确保代码中List("domains/domain.com")里的域名和Postmaster Tools中验证的域名完全一致,不要加www或其他前缀,比如验证的是domain.com就写domains/domain.com,验证的是sub.domain.com就写domains/sub.domain.com。Google Workspace用户额外配置
如果你是Google Workspace用户,使用全域授权时,服务账号需要模拟一个Workspace域内的用户(该用户需已被添加为Postmaster Tools域名管理员),代码需修改为:var credential = GoogleCredential.FromFile("path/to/file.json") .CreateScoped(new[] { "https://www.googleapis.com/auth/postmaster.readonly" }) .CreateWithUser("authorized-user@your-workspace-domain.com"); // 替换为Workspace域内的授权用户邮箱
内容的提问来源于stack exchange,提问作者Leo

