Существует ли поддерживаемый способ проверки подлинности учетной записи службы с помощью облачного Google Python SDK без использования файла ключей? - PullRequest
1 голос
/ 30 апреля 2019

Я работаю в среде CI / CD, где запись файла ключа JSON на диск или включение его в проект строго запрещено. Все, что я могу сделать, это вставить необработанные данные JSON в переменную окружения, которую мы можем прочитать во время выполнения. Обычный подход установки GOOGLE_APPLICATION_CREDENTIALS в качестве пути к ключевому файлу здесь не сработает, так как мы не можем сначала написать файл. Он должен содержать данные JSON непосредственно в виде строки.

К сожалению, во всей найденной мною документации Google Cloud предполагается, что файл ключа JSON существует до аутентификации. Там нет обсуждения того, как аутентифицироваться напрямую через значения переменных. Самая близкая вещь, которую я нашел , намекает на то, что установка учетных данных в явном виде возможна, но на связанной странице обсуждаются только внутренние свойства класса Credentials.

К счастью, мне повезло больше читать код , чем документацию. Немного покопавшись, я нашел файл ServiceAccountCredentials._from_parsed_json_keyfile, который позволяет мне делать то, что я хочу. Вот мой тестовый код:

import os
import json
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient import discovery

# Prepare the service object
json_data = json.loads(os.getenv("MY_CREDENTIALS_STRING"))
credentials = ServiceAccountCredentials._from_parsed_json_keyfile(json_data, scopes='')
service = discovery.build('compute', 'v1', credentials=credentials)

# Test the service object
request = service.images().list(project='my-project')
response = request.execute()
print(response)

Это работает, но похоже на взлом. '_' В названии функции говорит мне, что она не является частью поддерживаемого API и может исчезнуть без предупреждения в будущей версии.

Я не вижу официального способа сделать это. Есть ли один?

1 Ответ

1 голос
/ 30 апреля 2019

Используйте класс google.oauth2.service_account.Членом является from_service_account_info.

Документация: ссылка .Исходный код: ссылка .

from google.oauth2 import service_account

// load from a file
// service_account_info = json.load(open('service_account.json'))

// load from system environment
service_account_info = json.loads(os.getenv("MY_CREDENTIALS_STRING"))

credentials = service_account.Credentials.from_service_account_info(service_account_info)
...