我一直試圖讓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域名方面缺少一些東西,但我想不出其他任何方法來檢查。
任何人有一個想法,我在做什麼錯了?
謝謝Emily!你是對的,我錯過了設置API客戶端訪問安全的一點。謝謝你這麼快回答我的問題! – user3388615
嗨,我有一個私人的電子郵件帳戶,我創建了一個服務帳戶。如何「將全域範圍的權限授予您的服務帳戶」?我不明白「轉到您的Google Apps網域的管理控制檯」。我沒有任何Google Apps訪問權限。我正在嘗試在日曆API中使用服務帳戶 – John