使用NodeJS通过服务账号调用Google Directory API列用户遇400错误
问题原因与解决方法
出现400 Invalid Input错误的核心原因是:服务账号调用Google Workspace Directory API必须配置域范围委派,并且在认证时指定要模拟的Workspace管理员账号,你目前的脚本和配置都遗漏了这两个关键步骤。
步骤1:配置域范围委派
- 打开Google Cloud控制台,找到你的服务账号详情页,点击「编辑」,找到「域范围委派」选项,勾选「启用Google Workspace域范围委派」,保存设置。
- 打开Google Workspace管理控制台,进入「安全性」→「API控制」→「域范围委派」,点击「添加新的客户端ID」:
- 输入服务账号的「客户端ID」(可在Cloud控制台服务账号的「详情」→「客户端ID」处找到)
- 在「OAuth 2.0 范围」里输入
https://www.googleapis.com/auth/admin.directory.user.readonly,保存。
步骤2:修正脚本
必须在认证配置中添加subject字段,指定一个拥有Workspace用户管理权限的管理员邮箱(比如admin@yourdomain.com),让服务账号模拟该管理员身份调用API。同时可以添加结果打印代码方便调试:
const { google } = require("googleapis"); (async () => { try { const auth = new google.auth.GoogleAuth({ keyFile: "credentials.json", scopes: ["https://www.googleapis.com/auth/admin.directory.user.readonly"], // 新增:指定要模拟的Workspace管理员邮箱 subject: "admin@yourdomain.com" }); const service = google.admin({ version: "directory_v1", auth }); const res = await service.users.list({ customer: "my_customer", maxResults: 10, orderBy: "email", }); // 打印返回的用户列表 const users = res.data.users; if (users.length) { console.log('Users:'); users.forEach((user) => { console.log(`${user.email} (${user.name.fullName})`); }); } else { console.log('No users found.'); } } catch (err) { console.error('Error fetching users:', err); } })();
额外注意事项
- 确保你指定的
subject邮箱是Google Workspace的管理员账号,且拥有查看用户列表的权限。 - 确认Admin SDK API已经在Cloud控制台中启用(你已经完成这一步,可忽略)。
内容的提问来源于stack exchange,提问作者grandouassou
相关产品推荐
相关产品推荐

