Невозможно пройти проверку подлинности с помощью ключа учетной записи облачной службы Google, созданного с помощью Python API - PullRequest
0 голосов
/ 01 июля 2019

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

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

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

Также на 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.

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

1 Ответ

0 голосов
/ 02 июля 2019

Отвечая на мою собственную проблему и, вероятно, помогая другим ...

«Ключ», который мы получаем из 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. Надеюсь, что это помогает другим.

...