我有一个脚本,可以利用该gcloud
工具为项目创建服务帐户。
我希望能够创建 GSuite 组,并在创建服务帐户的同一脚本中将服务帐户添加到其中,所以我不必在 Web UI 中手动执行此操作。
我更愿意尽可能通过 CLI 完成这些工作,包括服务账户和 GSuite 身份验证的初始设置等。
在 gcloud 和 gsuite 之间进行身份验证以及如何使用 gcloud 服务帐户自动执行 GSuite 任务时存在很多冲突的信息。
以下流程是怎样的:
- 获取向 GSuite API 提交请求所需的身份验证信息
- 授予获得上述内容所需的任何权限/范围
- 实际上使用该身份验证来创建一个组/将用户添加到组/等等。
我更愿意使用 CLI 工具(例如gcloud
)或 CURL 来执行任何 API 请求。如果需要客户端 SDK,我更喜欢 NodeJS SDK。
更新
为了澄清迄今为止我所测试的内容,在浏览了 Google 开发者门户上大量过时的文档后,我:
- 在 GCloud 中为我的项目启用了“Admin SDK API”(Google 经常引用“Directory”API,但这不是可以在 GCloud API 中启用的功能,因此我认为他们指的是 Admin SDK API 中的 Directory API)
- 创建服务帐号并赋予其
owner
项目角色 - 在服务帐户上启用全域委派以获取其客户端 ID
https://www.googleapis.com/auth/admin.directory.group
在 Google Admin(GSuite)控制台中,我在“安全 -> 管理 API 客户端访问”和“安全 -> API 控制 -> 全域委派”中为服务帐户客户端 ID 赋予了范围- 使用oauth2l使用 curl 工具生成具有范围的 bearer token
admin.directory.group
- 尝试使用该承载令牌通过以下命令创建一个组:
curl --request POST 'https://www.googleapis.com/admin/directory/v1/groups' --header "$(oauth2l header --json /home/<file containing the secret for the service account> --scope admin.directory.group)" --header 'Accept: application/json' --header 'Content-Type: application/json' --data '{"email":"[email protected]"}' --compressed
- Gsuite 返回了一个方便的 403
Not Authorized to access this resource/api
。
在整个 Google 文档中,他们建议您使用 API Explorer 来尝试这些功能,但该工具现已不再存在。
在里面目录API先决条件页面描述了如何设置管理控制台的 API——那里描述的选项也不存在。
答案1
TL:DR:你需要与目录 API从G Suite 开发工具包
获取向 GSuite API 提交请求所需的身份验证信息
在目录 API:先决条件页面我们可以阅读你需要遵循的步骤设置 API:
1 从管理控制台启用 API 访问,以便向目录 API 发出请求。要启用 API,请登录您的管理员帐户并选择安全。如果您没有看到列出的“安全”,请选择 更多控制进而安全从灰色框中显示的选项中选择 API 参考,然后选中复选框以启用 API 访问。保存您的更改。
2 在Google API 控制台并为该项目激活 Admin SDK 服务
授予获得上述内容所需的任何权限/范围
在目录 API:授权请求您可以阅读更多有关流程的信息使用 OAuth 2.0 授权请求以及您需要的范围。由于您只想管理组,因此您需要添加“组、组别名和组成员的范围”的范围。您需要添加的范围是:
范围: https://www.googleapis.com/auth/admin.directory.group
意义: 访问所有组操作的全局范围,包括组别名和成员。
实际上使用该身份验证来创建一个组/将用户添加到组/等等。
由于您将使用 BASH 与 API 交互,因此您需要使用 CURL 对 API 执行查询。因此我将发布的所有示例都使用 CURL。
在目录 API:群组您可以阅读您可以执行的操作以及如何执行此类操作。
例如,如果你想创建一个组,需要执行 POST 操作来“https://www.googleapis.com/admin/directory/v1/groups“其有效负载为 JSON,格式如下:
{
"email": "[email protected]",
"name": "Sales Group",
"description": "This is the Sales group."
}
因此 CURL 命令将如下所示:
curl --request POST \
--header "Content-Type: application/json" \
--header "Authorization: Bearer <ACCESS TOKEN>" \
--data '{"email":"[email protected]","name":"Sales Group","description":"This is the Sales group."}' \ https://www.googleapis.com/admin/directory/v1/groups
成功响应将返回 HTTP 201 状态代码。除了状态代码外,响应还会返回新组的属性。
如果您在获取 TOKEN 时遇到问题,您可以阅读一些关于如何获取 OAUTH 2.0 令牌的文章:
https://stackoverflow.com/questions/28593022/list-google-drive-files-with-curl https://stackoverflow.com/questions/44063975/get-access-token-of-google-api https://developers.google.com/google-ads/api/docs/concepts/curl-example https://www.jhanley.com/google-oauth-2-0-testing-with-curl/
答案2
我遇到了与 OP 完全相同的问题,文档太糟糕了。通过在 Google Workspace 管理界面上向我的服务帐户授予“群组管理员”角色来解决:管理员角色 > 群组管理员 > 服务帐户