Включить пересылку почты с помощью аккаунта Служб Google

20 апреля 2015 г. прекращается работа нескольких API Служб Google, в том числе API предоставления (gdata).
В моих скриптах Python я использую учетную запись службы и OAuth 2.0 вместо ClientLogin и API замены: API каталогов.
Однако я не могу найти способ включить пересылку почты с помощью нового API, и вся документация Google по Python для пересылки почты объясняет, как это сделать с помощью ClientLogin, которая также прекращается 20 апреля.

Соответствующая информация:
У меня есть служебная учетная запись, и я соответствующим образом авторизовал ее в соответствии с этим руководством: https://developers.google.com/api-client-library/python/auth/service-accounts
Все остальные мои функции работают с новым API!
Я тщательно изучил документацию по API API (хотя не исключаю, что что-то пропустил): https://developers.google.com/resources/api-libraries/documentation/admin/directory_v1/python/latest/index.html
Единственная документация Google (которую я нашел) о реализации пересылки почты с помощью Python предлагает использовать ClientLogin, как упоминалось выше: https://developers.google.com/admin-sdk/email-settings/

Мой существующий рабочий код для пересылки почты (на основе этой документации):

client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
client.ClientLogin(email=adminEmail, password=adminPass, source='apps')
client.UpdateForwarding(username=username, enable=True, 
    forward_to=forwardTo, action='ARCHIVE')

Мой обновленный код основан на ответе Джея Ли:

credentials = SignedJwtAssertionCredentials(serviceEmail, key, sub=adminEmail, 
    scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/ '+'other scopes')
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
client.additional_headers = {'Authorization': 'Bearer %s' % credentials.access_token}
client.UpdateForwarding(username=username, enable=True, 
    forward_to=forwardTo, action='ARCHIVE')

И я добавил новую область в свою учетную запись службы в:
Консоль администратора-> Безопасность-> Расширенные настройки-> Управление клиентским доступом API (в разделе Аутентификация)
* Примечание. Если вы используете другие области действия, вам необходимо ввести их все, поскольку они заменяют ваши предыдущие настройки.

Обновить:
Я думал, что у меня это работает, но я, возможно, закомментировал строку или проигнорировал. Когда я попробовал свой код позже в тот же день, когда все строки выполнялись правильно, он по-прежнему выдавал мне ошибку gdata.client.Unauthorized. Я попытался перезапустить свой сервер, чтобы вновь создать учетные данные, но это не помогло. Ошибка возникает, когда я пытаюсь сделать обновление переадресации вызова.
Я подтвердил, что access_token такой же, как тот, который работает для моих вызовов API Справочника, и что "клиент" на самом деле является объектом emailSettingsClient.
Полная ошибка, которую я получаю:

Несанкционированное сообщение об ошибке

Еще одна попытка основана на следующем:
http://www.worldofchris.com/blog/2012/12/27/fun-with-oauth-gdata-google-apis-client-library-python/
https://groups.google.com/forum/m/#!msg/google-apps-developer-blog/1pGRCivuSUI/3EAIioKp0-wJ Как авторизовать клиент gdata без использования рабочего процесса gdata oauth2?

credentials = SignedJwtAssertionCredentials(serviceEmail, key, sub=adminEmail, 
    scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/ '+'other scopes')
auth = gdata.gauth.OAuth2Token(serviceEmail, key, 
    scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/',
    access_token=credentials.access_token,
    refresh_token=credentials.refresh_token,
    user_agent='emailsettings/2.0')#I do not really understand this param
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
#Also tried with (domain='mydomain.co', auth_token = credentials.access_token)
client.additional_headers = {'Authorization': 'Bearer %s' % credentials.access_token}
auth.authorize(client)
client.UpdateForwarding(username=username, enable=True, 
    forward_to=forwardTo, action='ARCHIVE')

2 ответа

Решение

Это должен быть правильный способ непосредственного использования объекта учетных данных:

import gdata.gauth

credentials = SignedJwtAssertionCredentials(serviceEmail,
                                            key, 
                                            sub=adminEmail,
                                            scope=scopes)
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
client.auth_token = gdata.gauth.OAuth2TokenFromCredentials(credentials)
client.UpdateForwarding(username=username, enable=True, 
forward_to=forwardTo, action='ARCHIVE')

Было несколько вещей, которые мне нужно было поменять на мое последнее обновление, чтобы мой код работал: мне нужно было использовать user_agent=credentials.user_agent, удалить client.additional_headersи я использовал client_id и client_secret из учетных данных вместо того, чтобы передавать их самому себе (не уверен, что это была проблема типа переменной).
Окончательный рабочий код:

credentials = SignedJwtAssertionCredentials(serviceEmail, key, sub=adminEmail, 
    scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/ '+'other scopes')
auth = gdata.gauth.OAuth2Token(
    credentials.client_id,#serviceEmail
    credentials.client_secret,#private key 
    scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/',
    access_token=credentials.access_token,
    refresh_token=credentials.refresh_token,
    user_agent=credentials.user_agent)
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
auth.authorize(client)
client.UpdateForwarding(username=username, enable=True, 
    forward_to=forwardTo, action='ARCHIVE')