Невозможно пройти аутентификацию с помощью ключа учетной записи облачной службы Google, созданного API Python

В приведенном ниже примере демонстрируется сбой аутентификации в учетной записи службы Google с использованием ключа, созданного всего несколькими строками выше с использованием API Python.

Мне не удалось найти ни одного документа о том, как можно использовать эти программные ключи.

Клавиши, созданные щелчком через пользовательский интерфейс консоли, работают нормально. Однако для нашего варианта использования нам нужно создать ключи программными способами.

На github также есть проблема без ответа: https://github.com/googleapis/google-cloud-python/issues/7824

logger.info("Created new service account: {}".format(ret))

logger.info("Getting the new service account key")

request=iam.projects().serviceAccounts().keys().create(name=ret['name'],
    body={'privateKeyType':'TYPE_GOOGLE_CREDENTIALS_FILE'})

key=request.execute()

>>>print json.dumps(key, indent=4) #just to verify what we got

{
    "keyOrigin": "GOOGLE_PROVIDED", 
    "name": "goodandvalidname", 
    "validBeforeTime": "2029-06-28T15:09:59Z", 
    "privateKeyData": "datadata", 
    "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE", 
    "keyAlgorithm": "KEY_ALG_RSA_2048", 
    "validAfterTime": "2019-07-01T15:09:59Z"
}

>>> credentials = google.oauth2.service_account.Credentials.from_service_account_info(key)
Traceback (most recent call last):
  File "/home/user/.p2/pool/plugins/org.python.pydev.core_7.2.1.201904261721/pysrc/_pydevd_bundle/pydevd_exec.py", line 3, in Exec
    exec exp in global_vars, local_vars
  File "<console>", line 1, in <module>
  File "/home/user/.local/lib/python2.7/site-packages/google/oauth2/service_account.py", line 193, in from_service_account_info
    info, require=['client_email', 'token_uri'])
  File "/home/user/.local/lib/python2.7/site-packages/google/auth/_service_account_info.py", line 51, in from_dict
    'fields {}.'.format(', '.join(missing)))
ValueError: Service account info was not in the expected format, missing fields token_uri, client_email.

Любая помощь приветствуется.


person R. Simac    schedule 01.07.2019    source источник


Ответы (1)


Отвечаю на свой вопрос и, возможно, помогаю другим...

«Ключ», который мы получаем от API-интерфейсов Python, НЕ является «ключом json», полученным от gcloud. Диктовка, которую мы получаем от iam.projects().serviceAccounts().keys().create(), содержит поле privateKeyData, которое само содержит ВЕСЬ «ключ json», необходимый для аутентификации в облаке Google.

Данные в этом поле закодированы в base64 и нуждаются в декодировании и последующем сбросе в json. Ниже приведен фрагмент функционального кода, демонстрирующий, что учетные данные загружаются обратно из такого ключа:

request=iam.projects().serviceAccounts().keys().create(name=ret['name'], 
   body={'privateKeyType':'TYPE_GOOGLE_CREDENTIALS_FILE'})

key=request.execute()

key=base64.decodestring(key['privateKeyData'])
key=json.loads(key)

credentials = google.oauth2.service_account.Credentials.from_service_account_info(key)

Я понял это, шаг за шагом создавая ключ учетной записи службы gcloud, строка за строкой, используя отладчик python. Надеюсь, это поможет другим.

person R. Simac    schedule 02.07.2019
comment
Мне пришлось изменить key=base64.decodestring(key['privateKeyData']) на key=base64.decodestring(key['privateKeyData']).encode()), чтобы все заработало. - person Florian Feldhaus; 27.05.2020