【发布时间】:2015-06-22 19:46:32
【问题描述】:
我正在将我们的旧用户管理脚本从 Google Provisioning API(使用 python gdata 库)移植到 Google Directory API(python admin-sdk 库)。到目前为止,大多数事情都很好,但是我在尝试发现用户所属的组时遇到了问题(我需要在删除用户之前删除成员资格)。甚至将代码剥离到最基本的要素(替换电子邮件/凭据以供公众使用):
#!/usr/bin/python
import httplib2
from apiclient import errors
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
SERVICE_ACCOUNT_EMAIL = 'XXXXXXXXXXXXXXXXXXXXXX@developer.gserviceaccount.com'
SERVICE_ACCOUNT_PKCS12_FILE_PATH = '/blah/blah/XXXXXXXX-privatekey.p12'
f = file(SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key,
scope='https://www.googleapis.com/auth/admin.directory.user', sub='serviceaccount@our.tld')
service.users()
members = service.members().get(memberKey = 'serviceaccount@our.old', groupKey = 'googlegroup@our.tld').execute()
print members
这会返回 403 权限错误:
Traceback (most recent call last):
File "group_tests.py", line 39, in <module>
members = service.members().get(memberKey = 'serviceaccount@our.tld', groupKey = 'googlegroup@our.tld').execute()
File "/XXX/bin/gapps/lib/python2.6/site-packages/oauth2client/util.py", line 137, in positional_wrapper
return wrapped(*args, **kwargs)
File "/XXX/bin/gapps/lib/python2.6/site-packages/googleapiclient/http.py", line 729, in execute
raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/admin/directory/v1/groups/googlegroup%40our.tld/members/serviceaccount%40our.tld?alt=json returned "Insufficient Permission">
我不知道这里的范围是否有误,如果有,应该是什么?此服务帐户已设置以下范围的权限(在安全>高级安全>API>管理 API 客户端访问):
https://www.googleapis.com/auth/admin.directory.user
https://www.googleapis.com/auth/admin.directory.group
或者我应该使用组而不是成员?喜欢:
members = service.groups().get(memberKey = 'serviceaccount@our.old', groupKey = 'googlegroup@our.tld').execute()
感谢任何指点,我已经在这方面寻找任何帮助一周了,但无济于事。
【问题讨论】:
-
您是否使用域范围的委派?该帐户是否有权访问组? developers.google.com/drive/web/delegation
-
是的,服务帐户(我在上面的代码 sn-ps 中删除了名称并使用了 serviceaccount@our.tld)对范围和项目具有完全权限。这是迄今为止我遇到的唯一一个收到此 403 错误的操作。同样,我怀疑这是因为我没有使用正确的函数/变量进入 execute()。