我正试图使用apiclient与我的Google Apps for Education帐户对接。我正在使用服务帐户作为最终目标是将其与我们现有的内部系统(即具有控制台访问权限的基于服务器的系统)联系起来。
我的代码是:
from httplib2 import Http
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
import pprint
with open('/path/mykey.p12') as f:
key = f.read()
client_email = "my_email@developer.gserviceaccount.com"
scope = ['https://www.googleapis.com/auth/admin.directory.user', 'https://www.googleapis.com/auth/admin.directory.group']
http = Http()
credentials = SignedJwtAssertionCredentials(client_email, key, scope=scope)
credentials.authorize(http)
admin = build('admin', 'directory_v1', http=http)
users = admin.users.list(domain="mydomain.edu").execute(http=http)
pprint.pprint(users)
当我运行代码时,我会得到以下回溯:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/home/ajford/.virtualenvs/aosa_usertools/local/lib/python2.7/site-packages/oauth2client/util.py", line 135, in positional_wrap
per
return wrapped(*args, **kwargs)
File "/home/ajford/.virtualenvs/aosa_usertools/local/lib/python2.7/site-packages/googleapiclient/http.py", line 723, in execute
raise HttpError(resp, content, uri=self.uri)
HttpError: <HttpError 403 when requesting https://www.googleapis.com/admin/directory/v1/users?domain=mydomain.edu&alt=json returned "Not Authorized to access this resource/api">
我已在应用程序管理控制台的安全页面上输入我的API访问信息。我已尝试添加sub=superadmin@mydomain.edu
。我已经确保在开发人员控制台中的项目上启用了Admin SDK。我已确保我在域下的用户帐户管理角色下的适当角色(如果有不同的话)。
我已经在API资源管理器下尝试了我的测试查询,它运行得很好。
我不知道该何去何从。有什么建议吗?
您不需要使用服务帐户。使用已安装的应用程序流并获取刷新令牌。只要授权没有被撤销,它就会一直有效。只有访问令牌过期,并且可以由刷新令牌续订。访问令牌刷新由客户端库自动处理,因此您的工作量较小。
语句不应该是吗
users = admin.users.list(domain="mydomain.edu").execute(http=http)
是
users = admin.users().list(domain="mydomain.edu").execute(http=http)