在 Google 应用程序中列出具有域委派的用户时出现 403

403 when listing users with domain delegation in Google Apps

我有一个 Google Apps 域,我想通过 Google Apps Admin API.

检索用户

我采取了以下步骤:

我有以下 Python 代码:

  creds = SignedJwtAssertionCredentials(SVC_ACCT_EMAIL, SVC_ACCT_KEY,
      scope='https://www.googleapis.com/auth/admin.directory.user')
  http = httplib2.Http()
  http = creds.authorize(http)
  dirSvc = build('admin', 'directory_v1', http=http)
  users = []
  page_token = None
  params = {
    'domain': MY_DOMAIN, # actually my domain here
  }
  page = dirSvc.users().list(**params).execute()
  users.extend(page['users'])

但是,它失败了 <HttpError 403 when requesting https://www.googleapis.com/admin/directory/v1/users?domain=MY_DOMAIN&viewType=domain_public&alt=json returned "Not Authorized to access this resource/api">

我确信我的凭据设置和代码是正确的,因为以下代码可以在云端硬盘中创建文件夹:

  creds = SignedJwtAssertionCredentials(SVC_ACCT_EMAIL, SVC_ACCT_KEY,
      scope='https://www.googleapis.com/auth/drive', sub=USER_EMAIL)
  http = httplib2.Http()
  http = creds.authorize(http)
  driveSvc = build('drive', 'v2', http=http)
  body = {
    'title': "Test Folder",
    'mimeType': "application/vnd.google-apps.folder",
  }
  folder = service.files().insert(body = body).execute()

这意味着我的服务帐户已正确创建、域授权,并且我已设法将至少一个 OAuth 范围与其相关联。

我尝试过的事情:

我研究过在查询中使用 customer 而不是 domain 来识别我的域,但我找不到我的 customerId。尝试为具有 user = dirSvc.users().get(userKey = USER_EMAIL).execute() 的用户获取它失败并显示相同的 403。无论如何,我的所有用户都在同一个域中。

我也没有尝试使用 OAuth 来处理这个请求; quickstart 使用 OAuth,但我希望对应用程序中的所有 API 使用相同的基于 public 密钥的服务帐户标识,而且我知道它在 Drive 上工作正常。

啊,没有什么比要求触发解决问题更好的了。

我修复了这个问题,使用了我在上面尝试过但第一次没有用的东西。我曾尝试在构建目录服务时添加 "sub=",但当时我还没有在 Apps 管理控制台中发现启用 API 的复选框。现在我已经检查了后者,在构建信用时传递一个管理员用户电子邮件地址解决了这个问题。