Google Python SDK权限范围设置异常引发403权限不足问题
解决Google Admin Directory API权限范围不生效的403问题
核心问题原因
google.auth.default()方法会优先读取系统中已有的默认凭证(比如gcloud CLI登录的凭证、环境变量指定的服务账号),你代码里传入的scopes参数会被这些已有凭证的scopes覆盖,导致声明的权限没生效。
针对性解决步骤
情况1:使用gcloud CLI的应用默认凭证
你之前删除本地凭证后重新运行,没指定scopes,所以gcloud又生成了带默认scopes的凭证。执行以下命令重新生成带指定权限的凭证:
gcloud auth application-default login --scopes=https://www.googleapis.com/auth/admin.directory.user.readonly,https://www.googleapis.com/auth/admin.directory.group.readonly
执行后会弹出浏览器让你登录域管理员账号,登录完成后,本地的应用默认凭证就会带上需要的scopes,再运行代码即可。
情况2:使用服务账号凭证
如果是用服务账号,不能依赖google.auth.default(),必须手动加载密钥文件并指定scopes,同时配置全域委派:
- 先在Google Cloud控制台给服务账号开启全域委派,然后在Google Admin控制台(admin.google.com)的「安全 > API控制 > 域宽委派」里,添加服务账号的客户端ID,并授权以下scopes:
https://www.googleapis.com/auth/admin.directory.user.readonlyhttps://www.googleapis.com/auth/admin.directory.group.readonly
- 修改代码为:
from google.oauth2 import service_account from googleapiclient.discovery import build # 替换为你的服务账号密钥文件路径 SERVICE_ACCOUNT_KEY_PATH = "/path/to/your/service-account-key.json" # 替换为域内有权限的管理员邮箱 ADMIN_EMAIL = "admin@sky.uk" USER_EMAIL = "target-user@sky.uk" SCOPES = [ "https://www.googleapis.com/auth/admin.directory.user.readonly", "https://www.googleapis.com/auth/admin.directory.group.readonly" ] # 加载服务账号凭证并指定scopes creds = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=SCOPES ) # 模拟域管理员用户(Admin API必须模拟域内用户调用) delegated_creds = creds.with_subject(ADMIN_EMAIL) service = build("admin", "directory_v1", credentials=delegated_creds) results = service.groups().list(domain="sky.uk", userKey=USER_EMAIL, maxResults=400).execute()
验证步骤
在代码里添加一行打印,确认凭证的scopes是否正确:
print(creds.scopes)
如果输出包含你需要的两个Admin Directory权限,说明配置生效了。
额外检查项
- 确认Google Cloud控制台已经启用了Admin SDK API;
- 调用API的用户(不管是gcloud登录的还是服务账号模拟的)必须是域内的管理员,至少拥有「群组管理员」权限。
内容的提问来源于stack exchange,提问作者qL9r0b51wvxnMsU
相关产品推荐
相关产品推荐

