调用Google API拉取用户列表时服务账号授权报403未授权问题求助
Google Admin Directory API 403 权限错误解决方法
核心原因
服务账号开启Google Workspace全域委托后,本身没有域资源的访问权限,必须模拟域内拥有用户管理权限的管理员账号调用接口,你的现有代码未指定模拟的管理员账号,因此触发权限拦截。
修复步骤
- 准备一个你的Google Workspace域内的管理员账号,要求该账号有用户列表查看/管理权限,优先使用域超级管理员账号,记好账号邮箱。
- 修改凭证创建代码,新增
subject参数指定模拟的管理员账号,修改后代码如下:
import google.auth import google.auth.transport.requests from google.oauth2 import service_account import requests credentials = service_account.Credentials.from_service_account_file( 'key.json', scopes=[ 'https://www.googleapis.com/auth/admin.directory.user', 'https://www.googleapis.com/auth/admin.directory.group', 'https://www.googleapis.com/auth/admin.directory.group.member', 'https://www.googleapis.com/auth/admin.directory.user.security', 'https://www.googleapis.com/auth/admin.directory.user.readonly' ], subject='admin@你的实际域名.com' # 新增本行,替换为你自己的域管理员邮箱 ) auth_req = google.auth.transport.requests.Request() credentials.refresh(auth_req) response = requests.get( 'https://www.googleapis.com/admin/directory/v1/users?domain=你的实际域名.com', # 替换为你自己的Workspace域名 headers={'Authorization': f'Bearer {credentials.token}'} ) print(response.json())
- 核对Google Workspace后台的API权限配置:进入「管理后台 > 安全 > 访问权限和数据控制 > API 控件 > 管理第三方应用的 API 访问权限」,确认你添加的客户端ID是服务账号的客户端ID(不是服务账号邮箱),且授权的范围和代码里的scopes完全一致。
- 验证模拟的管理员账号权限:直接用该管理员账号登录Google Admin后台,确认可以正常查看域内全量用户列表。
仍报错的排查方向
- 确认服务账号的全域委托开关已经开启,可在Google Cloud控制台「IAM与管理 > 服务账号 > 对应服务账号 > 高级设置」里查看状态。
- 确认你使用的密钥文件是当前开启全域委托的服务账号对应的密钥,没有混用其他服务账号的密钥。
- 确认你的Google Workspace域名是已经完成备案验证的有效域名,没有使用测试域名或者未绑定的域名。
内容的提问来源于stack exchange,提问作者Artiom
相关产品推荐
相关产品推荐

