Google API Python Client: сохранение access token при использовании service account

Проблема: текущий python клиент Google API не хранит access token в режиме доступа к API с помощью service account, что происходит из-за отсутствия полноценной поддержки хранилища данных (oauth2client.file.Storage). При каждом новом запросе к функциям API необходим дополнительный запрос на обновление access token, что занимает немало времени (около секунды).

Решение: изменение исходного кода oauth2client.client.

Теперь следующий код запроса к функциям API будет работать:

import httplib2
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
from oauth2client.file import Storage

logging.getLogger().setLevel(logging.INFO)

f = file('616591315bc79b4b964cf6c2d4afbe3b1a82a1c1-privatekey.p12', 'rb')
key = f.read()
f.close()

# First argument is e-mail provided in Google API Console for service account
credentials = SignedJwtAssertionCredentials(
    '...@developer.gserviceaccount.com',
    key,
    scope='https://www.googleapis.com/auth/fusiontables')
storage = Storage('fusion.dat')
credentials.set_store(storage)

http = httplib2.Http()
http = credentials.authorize(http)

service = build("fusiontables", "v1", http=http)
response = service.query().sqlGet(sql='SELECT Location FROM 1gvB3SedL89vG5r1128nUN5ICyyw7Wio5g1w1mbk LIMIT 10').execute(http)
for row in response['rows']:
    print unicode(row[0]).encode('utf-8')

При текущей версии клиента код выдавал ошибку:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x82 in position 1: invalid start byte

Я немного поковырялся в исходниках и исправил ситуацию. Исходный файл пропатченного client.py для пакета oauth2client прикрепляю к этой записи. Коммит пока не делал, т.к. не до конца уверен, что изменения не затронут другие режимы (client, web-application).

PS: кстати, если у вас при использовании клиента даже в простом режиме появляется ошибка «invalid_grant» – проверьте системное время! Я долго бился об стенку, пока на нашел такое предположение, и оно оказалось верным! Может быть, это из-за second leap?! Не скажу точно.

Скачать пропатченный исходный код oauth2client.client.