Я пытаюсь использовать API Gmail с библиотекой клиентов Google Python.Поддерживает ли API Gmail использование учетных записей службы OAuth?
Я создал учетную запись учетной записи службы через консоль разработчика Google.
Я затем пытаюсь использовать эти учетные данные следующим образом:
from oauth2client.client import SignedJwtAssertionCredentials
client_email = '<sanitised>@developer.gserviceaccount.com'
with open("foobar-<sanitised>.p12") as f:
private_key = f.read()
credentials = SignedJwtAssertionCredentials(client_email, private_key, 'https://www.googleapis.com/auth/gmail.readonly')
from httplib2 import Http
http_auth = credentials.authorize(Http())
from apiclient.discovery import build
gmail_server = build('gmail', 'v1', http=http_auth)
Однако, когда я пытаюсь использовать фактический API Gmail, я получаю HTTP 500 ошибки:
In [13]: threads = gmail_server.users().threads().list(userId='me').execute()
---------------------------------------------------------------------------
HttpError Traceback (most recent call last)
<ipython-input-13-a74134635cc3> in <module>()
----> 1 threads = gmail_server.users().threads().list(userId='me').execute()
/Users/victorhooi/.virtualenvs/kenny/lib/python2.7/site-packages/oauth2client/util.pyc in positional_wrapper(*args, **kwargs)
133 else: # IGNORE
134 pass
--> 135 return wrapped(*args, **kwargs)
136 return positional_wrapper
137
/Users/victorhooi/.virtualenvs/kenny/lib/python2.7/site-packages/googleapiclient/http.pyc in execute(self, http, num_retries)
721 callback(resp)
722 if resp.status >= 300:
--> 723 raise HttpError(resp, content, uri=self.uri)
724 return self.postproc(resp, content)
725
HttpError: <HttpError 500 when requesting https://www.googleapis.com/gmail/v1/users/me/threads?alt=json returned "Backend Error">
Абонента что, по-видимому, «учетные записи службы» не поддерживают использование API GMail:
https://stackoverflow.com/a/24645874/139137
Может ли кто-нибудь подтвердить, действительно ли это так, или если он документирован Google в любом месте?
Мое предположение заключалось в том, что, поскольку учетные данные учетной записи службы были созданы с помощью консоли разработчика Google, она просто будет связана с этим пользователем и должна работать нормально?
EDIT:
Я также упоминал, что я действительно пытался явно добавлять мой клиент на странице "Управление Client API Access" в консоль администратора Google Apps:
Однако, Я все еще получаю ошибку HTTP 500 Backend.
Кроме того, ссылки справки на этой странице переходят на страницу OAuth 1.0 - у меня есть подозрение, что эта страница предназначена только для OAuth 1.0, хотя в ней явно не упоминается.
EDIT 2
Кроме того, я должен отметить, что я попытался с помощью Google API Explorer, по адресу:
https://developers.google.com/apis-explorer/#p/gmail/v1/gmail.users.messages.list?userId=me&_h=1&
с использованием OAuth 2.0 и интерактивный поток пользователей, и она отлично работает (т.е. он перечисляет электронные письма).
EDIT 3
Я попытался добавить sub
аргумент, как предложил Джей Ли.
На моем собственном домене Служб Google, это на самом деле работает:
from oauth2client.client import SignedJwtAssertionCredentials
client_email = '<sanitised>@developer.gserviceaccount.com'
with open('foo-bar-<sanitised>.p12') as f:
private_key = f.read()
credentials = SignedJwtAssertionCredentials(client_email, private_key, 'https://www.googleapis.com/auth/gmail.readonly', sub='[email protected]')
from httplib2 import Http
http_auth = credentials.authorize(Http())
from apiclient.discovery import build
gmail_server = build('gmail', 'v1', http=http_auth)
threads = gmail_server.users().threads().list(userId='me').execute()
А потом темы дает мне:
In [12]: threads
Out[12]:
{u'nextPageToken': u'00058094761552980977',
u'resultSizeEstimate': 178,
u'threads': [{u'historyId': u'8942',
u'id': u'14abc26f1893823b',
u'snippet': u''},
{u'historyId': u'8822', u'id': u'14a4ffc2724e9384', u'snippet': u''},
{u'historyId': u'8769', u'id': u'14a36a9c6f552af3', u'snippet': u''},
{u'historyId': u'8716', u'id': u'14a31822f19bb161', u'snippet': u''},
{u'historyId': u'8671', u'id': u'14a2bee13eb87c07', u'snippet': u''},
Однако, когда я пытаюсь использовать вспомогательный аргумент на моей корпоративной Служб Google домен, когда я получаю следующую строку:
gmail_server = build('gmail', 'v1', http=http_auth)
Это дает мне ошибку:
AccessTokenRefreshError: access_denied: Requested client not authorized.
Я уверен, что клиент существует на консоли разработчика Google, и включен Gmail API. Я просто не знаю, почему аргумент sub
вызывает эту ошибку.
И потом, если я попробовать тот же код, используя другую учетную запись на корпоративном домене Служб Google, которые не были делегированы, я получаю:
AccessTokenRefreshError: unauthorized_client: Unauthorized client or scope in request.
Спасибо за предложение. Я попробовал это (см. Редактировать 3 выше), однако, когда я добавляю это, это дает мне другое сообщение об ошибке («AccessTokenRefreshError: access_denied: запрошенный клиент не авторизован».) – victorhooi
Вам необходимо предоставить доступ учетной записи службы к вашей работе домен: https://developers.google.com/admin-sdk/directory/v1/guides/delegation#delegate_domain-wide_authority_to_your_service_account Убедитесь, что использовать одни и те же области действия при предоставлении, что вы запрашиваете в вашем коде. –