如何调试Google API调用中的'unauthorized_client'授权错误
明确指定授权范围:当前代码未显式设置scopes,服务账号默认不会请求任何Workspace相关权限。需在创建Credentials时添加对应scopes参数,比如Admin Directory API的
https://www.googleapis.com/auth/admin.directory.group.readonly。修改代码如下:from google.oauth2 import service_account from googleapiclient.discovery import build SCOPES = ['https://www.googleapis.com/auth/admin.directory.group.readonly'] creds = service_account.Credentials.from_service_account_file("<cred>.json", scopes=SCOPES) delegated_creds = creds.with_subject("<admin_email@my_domain>") admin_service = build('admin', 'directory_v1', credentials=delegated_creds) results = admin_service.groups().list(userKey="<myemail@mydomaim>").execute()注意:scopes必须与Admin Console中授权的范围完全一致,不能多也不能少。
验证模拟账号的权限:即使是超级管理员,也要确认该账号是否被组织单元权限策略限制了Admin Directory API访问。可直接用该账号登录Admin Console,手动查看目标用户的群组,确认操作可行。
检查服务账号的IAM角色:Workspace API访问主要依赖域范围委派,但需确保服务账号未被添加冲突的限制性IAM角色。在GCP控制台IAM页面,查看该账号的角色列表,移除不必要的限制性角色。
启用详细日志排查:
- 在GCP Cloud Logging中创建过滤器:
protoPayload.methodName:"google.admin.directory.v1.GroupsService.List"或protoPayload.status.code:401,排查是否有遗漏的请求日志。 - 在代码中添加调试日志,打印credentials的scopes信息,确认权限范围已正确加载:
print("Credentials scopes:", creds.scopes)
- 在GCP Cloud Logging中创建过滤器:
重新生成服务账号密钥:密钥文件可能存在隐性格式或同步问题,尝试在GCP控制台删除现有密钥,重新生成新的JSON密钥文件替换使用。
确认域范围委派同步状态:Admin Console中的域范围委派设置可能需要数分钟到几小时完全同步,若刚完成配置,等待一段时间后重试。
测试最小权限场景:创建仅含必要scopes的测试授权,使用最基础的API调用(如
admin_service.groups().list(customer='my_customer').execute()),排除用户参数导致的问题。
内容的提问来源于stack exchange,提问作者Devesh

