Как я могу использовать SignedJwtAssertionCredentials с файлом ключа Google Analytics JSON?

Я пытаюсь подключиться к Google Analytics в серверном приложении, следуя инструкциям здесь: https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-py. На этой странице предлагается использовать ключ P12, но мне нужно использовать ключ JSON по бизнес-причинам (это также «рекомендуется» на странице генерации ключа в консоли разработчика).

Пример кода отлично работает для меня, когда я использую файл P12 — оба вызова authorize и build работают, и тогда я могу правильно использовать API. Я не могу использовать файл JSON. Вот минимальный пример:

from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
import json
import base64
import httplib2

def authorize(ga_email, ga_secret):
    jwt = SignedJwtAssertionCredentials(ga_email, ga_secret, scope=self.ga_scope, private_key_password='notasecret')
    http = jwt.authorize(httplib2.Http())
    return build('analytics', 'v3', http=http)

# this works
ga_email = '[email protected]'
with open('client_secrets.p12', 'rb') as f:
    ga_secret = f.read()
service = authorize(ga_email, ga_secret)

# this fails
with open('client_secrets.json', 'r') as f:
    json_data = json.load(f)
ga_email = json_data['client_email']
ga_secret_json = json_data['private_key']
ga_secret_b64 = ''.join(ga_secret_json.split('\n')[1:-2])
ga_secret_bin = base64.b64decode(ga_secret_b64)
ga_secret = ga_secret_bin # or ga_secret_b64 or ga_secret_json
service = authorize(ga_email, ga_secret)

Попытка JSON не удалась с этой ошибкой (с использованием ga_secret_bin):

File "/usr/local/lib/python2.7/dist-packages/pyOpenSSL-0.15.1-py2.7.egg/OpenSSL/_util.py", line 48, in exception_from_error_queue
    raise exception_type(errors)
Error: [('asn1 encoding routines', 'ASN1_CHECK_TLEN', 'wrong tag'), ('asn1 encoding routines', 'ASN1_TEMPLATE_EX_D2I', 'nested asn1 error'), ('asn1 encoding routines', 'ASN1_TEMPLATE_NOEXP_D2I', 'nested asn1 error')]

Или аналогично (используя ga_secret_json или ga_secret_b64):

Error: [('asn1 encoding routines', 'ASN1_CHECK_TLEN', 'wrong tag'), ('asn1 encoding routines', 'ASN1_ITEM_EX_D2I', 'nested asn1 error')]

Я пробовал несколько других перестановок: варианты обработки строк и декодирования base64, без использования аргумента private_key_password и так далее. Я также попытался использовать from_json, заполнив поля электронной почты, ключа и другие поля на основе вывода to_json после создания объекта учетных данных с ключом P12.

Я думаю, что упускаю что-то простое, но я не очень хорошо знаком с OpenSSL, поэтому не знаю, что искать.


person monguin    schedule 02.12.2015    source источник


Ответы (1)


Мое решение: обновить google-api-python-client с версии 1.0rc1.

person monguin    schedule 03.12.2015