5

我一直試圖讓Google Admin SDK的服務帳戶認證工作幾天到現在徒勞無功。我使用的是Google最新安裝的google-api-python-client-1.2庫。谷歌Python管理SDK使用Oauth2服務帳戶(教育版) - 「oauth2client.client.AccessTokenRefreshError:access_denied」異常

我一直在關注Google的主題文檔。鏈接在此:

HTPS://developers.google.com/accounts/docs/OAuth2ServiceAccount

HTPS://developers.google.com/api-client-library/python/guide/aaa_oauth

HTP://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.client.SignedJwtAssertionCredentials-class.html

而且具有tasks.py服務帳戶例如工作,你可以在這裏找到:

htp://code.google.com/p/google-api-py馬拉松客戶端/源/瀏覽/樣品/ service_account/tasks.py R = c21573904a2df1334d13b4380f63463c94c8d0e8

並已在相關主題仔細研究這兩個堆棧溢出線程在這裏:

google admin sdk directory api 403 python

Google Admin API using Oauth2 for a Service Account (Education Edition) - 403 Error

並研究了gam.py(Dito GAM)中的相關代碼。

但是我仍然缺少一些東西,因爲我在幾乎每個測試用例中都會遇到'oauth2client.client.AccessTokenRefreshError:access_denied'異常。

下面是測試驗證的簡明例如:

import httplib2 
from apiclient.discovery import build 
from oauth2client.client import SignedJwtAssertionCredentials 

f = file('myKey.p12', 'rb') 
key = f.read() 
f.close() 

credentials = SignedJwtAssertionCredentials(
    '[email protected]', 
    key, 
    sub='[email protected]', 
    scope = ['https://www.googleapis.com/auth/admin.directory.user',]) 

http = httplib2.Http() 
http = credentials.authorize(http) 
service = build('admin', 'directory_v1', http=http) 

當我運行上面的代碼中,我得到這個堆棧轉儲和異常:

Traceback (most recent call last): 
    File "./test.py", line 17, in <module> 
    service = build('admin', 'directory_v1', http=http) 
    File "/usr/lib/python2.7/dist-packages/oauth2client/util.py", line 132, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "/usr/lib/python2.7/dist-packages/apiclient/discovery.py", line 192, in build resp, content = http.request(requested_url) 
    File "/usr/lib/python2.7/dist-packages/oauth2client/util.py", line 132, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "/usr/lib/python2.7/dist-packages/oauth2client/client.py", line 475, in new_request 
    self._refresh(request_orig) 
    File "/usr/lib/python2.7/dist-packages/oauth2client/client.py", line 653, in _refresh 
    self._do_refresh_request(http_request) 
    File "/usr/lib/python2.7/dist-packages/oauth2client/client.py", line 710, in _do_refresh_request 
    raise AccessTokenRefreshError(error_msg) 
oauth2client.client.AccessTokenRefreshError: access_denied 

我已經試過多個超級用戶賬戶,服務帳戶和密鑰,並始終以相同的異常結束。如果我將sub添加到tasks.py示例中,最終會出現相同的錯誤。用prn替換sub也會產生這個異常,並且添加private_key_password ='notasecret'什麼也不做(這是默認設置)。 Admin SDK在Google Developers Console中激活,目標帳戶擁有超級用戶權限。這讓我覺得Google域名方面缺少一些東西,但我想不出其他任何方法來檢查。

任何人有一個想法,我在做什麼錯了?

回答

1

您是否已在您的管理控制檯中爲您的服務帳戶授予第三方客戶端訪問權限?

我要去設置服務帳戶的指示是Google對Drive Api的指示。

https://developers.google.com/drive/web/delegation

看看在「委託域範圍內的權力,您的服務帳戶」部分,看看是否已經完成這些步驟。

+0

謝謝Emily!你是對的,我錯過了設置API客戶端訪問安全的一點。謝謝你這麼快回答我的問題! – user3388615

+0

嗨,我有一個私人的電子郵件帳戶,我創建了一個服務帳戶。如何「將全域範圍的權限授予您的服務帳戶」?我不明白「轉到您的Google Apps網域的管理控制檯」。我沒有任何Google Apps訪問權限。我正在嘗試在日曆API中使用服務帳戶 – John

0

也許不是OP的問題,但我有同樣的錯誤,我的問題是,我設置的子場中的憑據對象

credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, 
     scope=SCOPES, sub=**<DON'T SET ME>**) 

如果您使用域範圍內的代表團,就需要沒有設置一個子(因爲你的「用戶」是域管理員。)在這一點上,文檔有點混亂。我剛剛刪除了子字段,它爲我工作。