403在Google Apps中列出具有域委派的用户时

时间:2015-04-02 01:45:07

标签: google-api google-admin-sdk

我有一个Google Apps域,我想通过Google Apps Admin API检索用户。

我已采取以下步骤:

  • 创建了一个服务帐户(在与Gmail帐户关联的项目下)
  • 在该项目中启用了Admin SDK API和Drive API
  • 在Google Apps域中,授权该服务帐户使用OAuth范围https://www.googleapis.com/auth/admin.directory.userhttps://www.googleapis.com/auth/drive
  • 进行域范围访问
  • 在"管理员>安全> API参考"该域的窗格,我已启用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范围与其关联。

我尝试过的事情:

  • 使用admin.directory.user.readonly范围
  • 在创建目录服务时使用sub =添加用户帐户电子邮件(对于管理员帐户)
  • 尝试view_type = domain_public

我在查询中使用customer代替domain来识别我的域名,但我无法找到customerId。尝试为user = dirSvc.users().get(userKey = USER_EMAIL).execute()的用户获取它同样的403失败。无论如何,我的所有用户都在同一个域中。

我还没有尝试过使用OAuth来处理此请求; quickstart使用OAuth,但我希望为应用中的所有API使用相同的基于公钥的服务帐户标识,并且我知道它可以正常用于云端硬盘。

1 个答案:

答案 0 :(得分:2)

啊,就像要求触发解决问题一样。

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