1

上個月,我完成了一個使用Python的GAE應用程序的工作,該應用程序廣泛使用各種Google API來管理Google管理員在公司域中的谷歌資源。該應用程序已完成!!!,但本月谷歌宣佈,我目前正在實施的EmailSettings API不再受支持,並且電子郵件設置將遷移到Gmail API;到目前爲止,他們已經遷移了一些設置(即發送 - 作爲別名,轉發,休假響應者和簽名)。在谷歌放在一起的遷移文檔中,他們指出了兩個API之間的主要區別,以及如何遷移它的一些含糊的參考。無論如何,我目前正在嘗試使用服務帳戶來實現新API以修改發件設置。這裏就是我如何創建服務帳戶的服務(再次,這是蟒蛇):Gmail設置API後端錯誤 - Python

scopes = ['https://mail.google.com/', 'https://www.googleapis.com/auth/gmail.settings.basic', 'https://www.googleapis.com/auth/gmail.settings.sharing'] 

email = "[email protected]" 
credentials = oauth2.service_account.build_credentials(scope=scopes, user=me)  
http = httplib2.Http() 
credentials.authorize(http) 
service = google_api_helper.build("gmail", "v1", credentials)  
body = {'emailAddress':'[email protected]'} 

service_2.users().settings().updateAutoForwarding(userId="me", body=body).execute() 

在這個特殊的例子中,我試圖更新AutoForwarding設置,但它是相同的場景和錯誤,因爲一些發送設置。我遇到的問題如下:對於谷歌打電話給他們的「微妙設置」,我需要使用範圍:'https://www.googleapis.com/auth/gmail.settings.sharing',這需要創建一個服務帳戶才能工作。

每當我嘗試雖然使用它,我得到一個500錯誤消息:

HttpError: https://www.googleapis.com/gmail/v1/users/me/settings/autoForwarding?alt=json returned "Backend Error">

如果我驗證域範圍內的訪問服務帳戶爲什麼我收到此錯誤,這是一個API錯誤還是我目前正在實施oauth2身份驗證的方式?我嘗試了好幾種實現方式都沒有成功:

使用應用程序默認身份驗證:

credentials = GoogleCredentials.get_application_default() 
httpauth = credentials.authorize(Http()) 
service = build("gmail", "v1", http=http_auth) 
aliases_2 = service.users().settings().sendAs().list(userId="[email protected]").execute() 

使用更新oauth2client庫,並通過本地JSON文件:

credentials_new = ServiceAccountCredentials.from_json_keyfile_name("app/service_account_key.json", scopes) 
delegated_credentials = credentials_new.create_delegated(sub="[email protected]") 
http_auth = delegated_credentials.authorize(Http()) 
service = build("gmail", "v1", http=http_auth) 

使用過時的oauth2client庫和使用在庫的新實現中不再支持SignedJwtAssertionCredentials功能:

credentials = SignedJwtAssertionCredentials(str(settings['oauth2_service_account']['client_email']).encode('utf-8'), settings['oauth2_service_account']['private_key'], scope=scopes, sub="[email protected]") 
auth2token = OAuth2TokenFromCredentials(credentials) 
# With this implementation i was able to provide the google admin account which is supposed to have super admin access to the "sub" parameter, this used to work for the EmailSettings API, but for this new implementation you need to pass the email of the user you are trying to gain access to. 
# build service 
# call API 

所有3個實現我都能夠調用基本範圍,但是每當我試圖對setting.sharing範圍下的任何設置進行任何更改時,我都會收到後端錯誤消息。這讓我瘋狂,我剛剛完成了這個應用程序!如果您有任何想法或如果您之前遇到過這個問題,請告訴我!!!!! ...

回答

0

更新:截至2016-08-11,這個問題應該修復。

截至2016年7月27日,授權後端存在導致此錯誤的錯誤,儘管它似乎隻影響某些域/用戶。我們正在修復。請致電this issue以獲取更新。

+0

埃裏克,謝謝你的迴應...我已經嘗試了3種不同的授權方法,我會密切關注這個問題,但我注意到他們只是提到轉發更新發生這種情況,但實際上它發生在https://www.googleapis.com/auth範圍內的每個服務/資源/gmail.settings.sharing;如果你是這個團隊的一部分,請檢查那個特定範圍內的資源;但直接的問題是授權問題......希望儘快解決問題。 – John

+0

昨天我們推出了一項解決方案,可以解決這個問題。注意:您必須使用具有服務帳戶的域範圍委派才能使用需要gmail.settings.sharing範圍的方法。 –

+0

Eric,在修復程序推出後,非常感謝您的及時響應!我將實施我需要的功能,並讓你們知道我是否面臨其他任何相關問題。當然,我們已經遵守了這些要求(即,具有全域代表團的服務帳戶),但再次感謝提醒。 – John