使用Oauth2作为服务帐户(教育版)的Google管理员API - 403错误

时间:2013-07-30 03:26:11

标签: python-2.7 google-oauth

我在使用Google新版Admin SDK时遇到了困难。特别是使用Oauth2的Directory API。 我想我几乎就在那里但是我一直试图使用Directory API(我使用Google Education Edition域)检索用户详细信息。

基本上我要做的就是编写一个python脚本,根据我们AD管理的注册状态来设置或取消用户。我有一个使用Oauth1执行此操作的脚本,但想要更新它以使用Oauth2。

以下是基于我发现的一些示例的代码段。

f = file('test_key.p12', 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(
     '606346240424-10stfco1ukj9h4m4b4r40@developer.gserviceaccount.com',
     key,
     scope= 'https://www.googleapis.com/auth/admin.directory.user')
http = httplib2.Http()
http = credentials.authorize(http)
service = build(serviceName='admin', version='directory_v1', http=http)

lists = service.users().get(userKey='joe.blogs@mydomain.com').execute(http=http)
pprint.pprint(lists)

这段代码似乎正确连接但是当我尝试执行查询时出现403错误。

错误:https://www.googleapis.com/admin/directory/v1/users/joe.blogs@mydomain.com ?alt = json返回"未授权访问此资源/ api& #34;>

我的第一个想法是因为我还没有在管理员控制台(Google API's console)上启用此API,但我有。 (实际上我打开了Admin SDK而不是Directory API,因为没有要启用的Directory API,并且看到它是Admin SDK的一部分吗?)。

我是否还缺少了另一个步骤,或者我在某个地方犯了一个愚蠢的错误?

2 个答案:

答案 0 :(得分:6)

布鲁斯,

你非常接近。

几件事:

所以完整的代码看起来有点像这样:

    # domain configuration settings
    import domainconfig

    f = file(domainconfig.KEY_FILE, "rb") # b reads file in binary mode; not strictly necessary, but safer to avoid strange Windows EOL characters: https://stackoverflow.com/questions/9644110/difference-between-parsing-a-text-file-in-r-and-rb-mode
    key = f.read()
    f.close()

    credentials = SignedJwtAssertionCredentials(

        domainconfig.SERVICE_ACCOUNT_EMAIL,
        key,
        scope = domainconfig.SCOPE, 
        sub=domainconfig.SUB_ACCOUNT_EMAIL # 'sub' supercedes the deprecated 'prn'

    )

    http = httplib2.Http()
    http = credentials.authorize(http)

    directoryservice = build("admin", "directory_v1", http=http)

    users = directoryservice.users()
    response = users.get(userKey='joe.blogs@mydomain.com').execute() 

答案 1 :(得分:0)

这应该有所帮助:https://developers.google.com/drive/delegation

在声明凭据时,您需要将其连接到将要更改的用户。从上面的链接中,请注意以下部分:

credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key,
scope='https://www.googleapis.com/auth/drive', sub=user_email)