如何授权服务帐户访问 Google 管理员 API

How to authorise a service account to access the Google Admin API

我们正在尝试创建与 Google Admin SDK 的集成,以便能够在我们的域中检索、更新和创建帐户。但是,我们不断收到 403 错误,表明我们无权访问 resource/api.

我们正在使用从启用了 Domain-wide 授权授权和以下两个范围的服务帐户获得的凭据: https://www.googleapis.com/auth/admin.directory.user.readonly, https://www.googleapis.com/auth/admin.directory.user. We are generating the JWT (which also includes these two scopes) and then sending a request to https://www.googleapis.com/oauth2/v4/token 检索访问令牌。

然后我们使用访问令牌向 https://www.googleapis.com/admin/directory/v1/users?domain=XXXX.com 发送请求。我们将访问令牌作为 Bearer 令牌包括在内,是 headers 的一部分。 在响应中,我们收到以下消息:

{
    "error": {
        "errors": [
            {
                "domain": "global",
                "reason": "forbidden",
                "message": "Not Authorized to access this resource/api"
            }
        ],
        "code": 403,
        "message": "Not Authorized to access this resource/api"
    }
}

是否可以澄清我们做错了什么?

为了使其正常工作,您必须设置 domain wide delegation 通过执行此操作,您的服务帐户将能够访问相关数据。

  1. 在 table 中找到新创建的服务帐户。在“操作”下,单击 more_vert,然后单击“编辑”。
  2. 在服务帐户详细信息中,点击 expand_more 显示全域委派,然后确保选中启用 G Suite 全域委派复选框。
  3. 如果您尚未配置应用程序的 OAuth 同意屏幕,则必须先配置,然后才能启用全域委派。按照屏幕上的说明配置 OAuth 同意屏幕,然后重复上述步骤并重新选中复选框。
  4. 单击“保存”更新服务帐户,return 到 table 个服务帐户。可以看到一个新的列,Domain-wide delegation。单击查看客户端 ID,获取并记录客户端 ID。

问题是 JWT 必须包含 sub 字段:应用程序请求委派访问的用户的电子邮件地址。