Зарегистрируйте ключ учетной записи Google Cloud Service, созданный в скрипте API Python.

Мне удалось создать учетную запись службы и собственный ключ через Python API iamcredetials.googleapis.com, но я не могу войти в систему, так как ключ имеет формат P12 и получен как dict, и я не могу найти способ чтобы войти в систему. есть ли способ создать файл p12 или что-то еще, чтобы я мог использовать ключ?

Я пытался использовать функции, доступные в модуле oauth2clinet.service_account.ServiceAccountCredentials(), но ни одна из них не загружает его успешно, я понимаю, что эта библиотека устарела и, возможно, я использую устаревшие методы.

Чем ближе я был к успешному входу в систему, тем больше я был при использовании функции _from_p12_keyfile_contents(), которая выдавала ошибку «подпрограммы кодирования», что выше моего понимания.

from oauth2client.service_account import ServiceAccountCredentials

from googleapiclient import discovery, errors, logging


default_creds = google_application_defaults()

service = discovery.build("iam", "v1", credentials=default_creds, cache_discovery = False)

key = service.projects().serviceAccounts().keys().create( name = serviceAccMail, body={}).execute()

creds = ServiceAccountCredentials._from_p12_keyfile_contents(accountEmail, newkey["privateKeyData"], "notasecret")

Error: [('asn1 encoding routines', 'asn1_check_tlen', 'wrong tag'), ('asn1 encoding routines', 'asn1_item_embed_d2i', 'nested asn1 error')]

Как правильно ввести этот ключ?


person Irribarra Cristián    schedule 20.12.2018    source источник


Ответы (1)


Формат учетной записи службы PFX (P12) устарел. Вернитесь в консоль Google и загрузите учетные данные служебной учетной записи в формате Json.

Как только вы загрузите свои учетные данные в формате Json, измените свой код:

from google.oauth2 import service_account

sa_file = 'full/path/to/service_account.json'

default_creds = service_account.Credentials.from_service_account_file(sa_file)

[Обновление: следующий код покажет, как использовать учетные данные P12]

Примечание. Учетные данные P12 работают не со всеми API Google (тип учетных данных отличается). Этот пример относится к Google Discovery API. Этот пример не будет работать, например, с google.cloud.storage.

'''
Test program to use P12 credentials with Google Cloud Storage
'''
from oauth2client.service_account import ServiceAccountCredentials
import googleapiclient.discovery

# Details on the Google Service Account. The email must match the Google Console.
project_id = 'development-123456'
sa_filename = 'compute-engine.p12'
sa_password = 'notasecret'
sa_email = '[email protected]'

SCOPES = ["https://www.googleapis.com/auth/cloud-platform"]

cred = ServiceAccountCredentials.from_p12_keyfile(
        sa_email,
        sa_filename,
        private_key_password=sa_password,
        scopes=SCOPES)

client = googleapiclient.discovery.build('storage', 'v1', credentials=cred)

buckets = client.buckets().list(project=project_id).execute()

print('')
print('Listing buckets:')
for bucket in buckets['items']:
    print(bucket['name'])
person John Hanley    schedule 21.12.2018
comment
О, это плохо. Я надеялся, что смогу управлять всеми ключами в автоматизированном сценарии. Неужели нельзя создать ключ в новом формате? или сохранить ключ p12 в файл, сгенерированный байтами, а затем загрузить его? - person Irribarra Cristián; 23.12.2018
comment
Почему это плохо? Вы просто выдаете учетные данные в правильном формате. Вы можете создать учетные данные с помощью glcloud или в консоли. Большинство SDK Google больше не поддерживают учетные данные P12 и API для загрузки учетных данных P12, которые были удалены. - person John Hanley; 23.12.2018
comment
@IrribarraCristián - я обновил свой пример, чтобы показать, как использовать учетные данные P12 с API Google Discovery. Это может помочь вам. - person John Hanley; 23.12.2018
comment
Спасибо за ваше разъяснение. Тем не менее, создание ключа в коде является обязательным для меня. Будет ли это работать, если я использую os.system() для вызова создания ключа через gcloud? - person Irribarra Cristián; 26.12.2018
comment
В моем блоге есть две статьи, которые могут вас заинтересовать. В первом показано, как преобразовать файл P12 в файл Json. Во втором показано, как создать токен доступа из учетных данных json. Не требуется и не используется Google SDK. jhanley.com/ jhanley.com/ - person John Hanley; 27.12.2018
comment
У меня есть код, который создает токены доступа из учетных данных P12, аналогичный этой статье для учетных данных Json jhanley.com/. Я мог бы опубликовать новую статью в ближайшие пару дней, которая посвящена непосредственному использованию учетных данных P12. - person John Hanley; 27.12.2018