2015-01-07 4 views
3

Я пытаюсь использовать 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:

enter image description here

Однако, Я все еще получаю ошибку 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

Попробуйте использовать:

credentials = SignedJwtAssertionCredentials(client_email, private_key, 
    'https://www.googleapis.com/auth/gmail.readonly', sub='[email protected]') 

, где [email protected]ain.com - пользователь, которого вы хотите олицетворять.

+1

Спасибо за предложение. Я попробовал это (см. Редактировать 3 выше), однако, когда я добавляю это, это дает мне другое сообщение об ошибке («AccessTokenRefreshError: access_denied: запрошенный клиент не авторизован».) – victorhooi

+1

Вам необходимо предоставить доступ учетной записи службы к вашей работе домен: https://developers.google.com/admin-sdk/directory/v1/guides/delegation#delegate_domain-wide_authority_to_your_service_account Убедитесь, что использовать одни и те же области действия при предоставлении, что вы запрашиваете в вашем коде. –

Смежные вопросы