在 Google 应用程序中列出具有域委派的用户时出现 403
403 when listing users with domain delegation in Google Apps
我有一个 Google Apps 域,我想通过 Google Apps Admin API.
检索用户
我采取了以下步骤:
- 创建了一个服务帐户(在与 gmail 帐户关联的项目下)
- 在该项目中启用了 Admin SDK API 和 Drive APIs
- 在 Google Apps 域中,授权服务帐户使用 OAuth 范围
https://www.googleapis.com/auth/admin.directory.user
和 https://www.googleapis.com/auth/drive
进行全域访问
- 在域的 "Admin > Security > API Reference" 窗格中,我启用了 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 使用相同的基于 public 密钥的服务帐户标识,而且我知道它在 Drive 上工作正常。
啊,没有什么比要求触发解决问题更好的了。
我修复了这个问题,使用了我在上面尝试过但第一次没有用的东西。我曾尝试在构建目录服务时添加 "sub=",但当时我还没有在 Apps 管理控制台中发现启用 API 的复选框。现在我已经检查了后者,在构建信用时传递一个管理员用户电子邮件地址解决了这个问题。
我有一个 Google Apps 域,我想通过 Google Apps Admin API.
检索用户我采取了以下步骤:
- 创建了一个服务帐户(在与 gmail 帐户关联的项目下)
- 在该项目中启用了 Admin SDK API 和 Drive APIs
- 在 Google Apps 域中,授权服务帐户使用 OAuth 范围
https://www.googleapis.com/auth/admin.directory.user
和https://www.googleapis.com/auth/drive
进行全域访问
- 在域的 "Admin > Security > API Reference" 窗格中,我启用了 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 使用相同的基于 public 密钥的服务帐户标识,而且我知道它在 Drive 上工作正常。
啊,没有什么比要求触发解决问题更好的了。
我修复了这个问题,使用了我在上面尝试过但第一次没有用的东西。我曾尝试在构建目录服务时添加 "sub=",但当时我还没有在 Apps 管理控制台中发现启用 API 的复选框。现在我已经检查了后者,在构建信用时传递一个管理员用户电子邮件地址解决了这个问题。