You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用service account调用Google API返回400 Invalid Input错误

问题根因

你漏了域范围委托(DWD)流程最关键的一步:服务账号本身不属于Google Workspace租户内的有效用户,调用Admin SDK接口时,必须显式指定一个拥有对应操作权限的Workspace真实管理员账号作为模拟身份。你现在的代码直接拿服务账号本身的身份发请求,Workspace目录接口识别不了这个身份,直接返回400 Invalid Input,和你之前做的控制台授权、密钥文件本身都没关系。
你之前照着文档完成的四步配置,只是给服务账号开了“可以模拟租户内用户”的权限,但代码里没指定要模拟的具体用户,请求自然无效。

修复步骤
  • 先准备好一个Workspace租户内的有效管理员账号:要么是超级管理员,要么是被分配了用户管理权限的自定义管理员,确认这个账号本身能在管理后台正常查看、操作用户目录。
  • 修改代码中加载服务账号凭证的逻辑,创建凭证时新增subject参数,值就是上面那个管理员的完整邮箱,修正后的核心代码如下:
def main():
    creds = service_account.Credentials.from_service_account_file(
        'credentials.json', 
        scopes=SCOPES,
        subject='admin@你的自有域名.com'  # 替换成你实际的管理员邮箱,这行是新增的
    )
    service = build('admin', 'directory_v1', credentials=creds)
    results = service.users().list(customer='my_customer', maxResults=10,
                                   orderBy='email').execute()
    users = results.get('users', [])

    if not users:
        print('No users in the domain.')
    else:
        print('Users:')
        for user in users:
            print(u'{0} ({1})'.format(user['primaryEmail'],
                                      user['name']['fullName']))
  • 保存修改后直接运行即可,不需要重新生成服务账号密钥,也不需要调整控制台已经配好的DWD授权规则。
避坑提示
  • subject参数绝对不能填服务账号自己的邮箱(后缀是*.iam.gserviceaccount.com的那个),必须填你自有域名下、真实存在的Workspace用户邮箱,填服务账号邮箱还是会报同样的错。
  • 如果改完之后报403 Forbidden,再回头检查三个点:DWD配置页填的服务账号Client ID是否正确、授权的Scope有没有拼写错误、你填的管理员账号本身是否拥有用户目录的操作权限。

内容的提问来源于stack exchange,提问作者rlandster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:45:42