аутентифицировать API Google без файла конфигурации - PullRequest
0 голосов
/ 26 мая 2020

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

Мой класс получает это dict:

   self._connection_data = {
        "type": args,
        "project_id": args,
        "private_key_id": args,
        "private_key": args,
        "client_email": args,
        "client_id": args,
        "auth_uri": args,
        "token_uri": args,
        "auth_provider_x509_cert_url": args,
        "client_x509_cert_url": args
    }

, а код -

   from google.cloud import bigquery
   from google.oauth2 import service_account

   def _get_client(self):

        credentials = service_account.Credentials.from_service_account_info(self._connection_data)
        return bigquery.Client(project=self._project_id, credentials=credentials, location='US')

Я получаю сообщение об ошибке

'{"error":"invalid_grant","error_description":"Invalid grant: account not found"}

однако все работает, когда я использую вспомогательный файл для config. json и переменная окружения ОС:

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "config.json"
self.job_config = bigquery.QueryJobConfig()
self.job_config.use_legacy_sql = True

return bigquery.Client()

Мне не нужно решение с переменной env, я бы хотел использовать класс Credentials без пути к файлу

Ответы [ 2 ]

1 голос
/ 27 мая 2020

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

Затем первый метод использует учетные данные по умолчанию в соответствии с документация :

Если вы не укажете учетные данные при создании клиента, клиентская библиотека будет искать учетные данные в среде.

Это означает, что вам просто нужно установить переменную среды. Затем клиентская библиотека Google определит учетные данные неявно. Кроме того, он также позволяет вам предоставлять учетные данные отдельно от вашего приложения, что упрощает процесс внесения изменений в код. Вы можете установить переменную среды следующим образом:

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json"

После ее установки вы сможете запустить следующий код :

def implicit():
    from google.cloud import storage

    # If you don't specify credentials when constructing the client, the
    # client library will look for credentials in the environment.
    storage_client = storage.Client()

    # Make an authenticated API request
    buckets = list(storage_client.list_buckets())
    print(buckets)

Во-вторых, вы Вы можете указать путь к файлу в вашем коде с помощью модуля [google.oauth2.service_account][3]. В документации указано, что:

Клиент OAuth 2.0 идентифицирует приложение и позволяет конечным пользователям аутентифицировать ваше приложение в Google. Он позволяет вашему приложению получать доступ к API Google Cloud от имени конечного пользователя.

Чтобы использовать модуль, вы можете использовать один из обоих кодов:

#It creates credentials using your .json file and the Credentials.from_service_account_file constructor
credentials = service_account.Credentials.from_service_account_file(
    'service-account.json')

Или

#If you set the environment variable, you can also use
#info = json.loads(os.environ['GOOGLE_APPLICATION_CREDENTIALS_JSON_STRING'])
#Otherwise, you specify the path inside json.load() as below
service_account_info = json.load(open('service_account.json'))
credentials = service_account.Credentials.from_service_account_info(
    service_account_info)

Наконец, я рекомендую вам проверить стратегии аутентификации в документации .

0 голосов
/ 27 мая 2020

Что ж. В конце концов мне удалось заставить свой код работать без необходимости в глобальной переменной или пути к файлу. У меня возникла проблема с моими настроенными учетными данными ...

Это код -

# init class here
    self.job_config = bigquery.QueryJobConfig()
    self.job_config.use_legacy_sql = True

def _get_client(self):
    credentials = service_account.Credentials.from_service_account_info(self._connection_data)
    return bigquery.Client(project=self._project_id, credentials=credentials)

 # function to get columns 
        query_job = self._get_client().query(query, job_config=self.job_config)
        results = query_job.result(timeout=self._current_timeout)

Единственная часть, которую мне не хватало, - это отправить класс QueryJobConfig с устаревшим SQL, установленным на верно во всех моих запросах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...