Проблема аутентификации в BigQuery API REST с использованием Python - PullRequest
0 голосов
/ 09 июля 2020

Я хотел бы выполнить HTTP-вызов этого ресурса: https://bigquery.googleapis.com/bigquery/v2/projects/ {projectId} / jobs

Читая документацию, я использую ключ API, сгенерированный из моего GCP проект для аутентификации. Итак, с помощью requests я делаю простой вызов, подобный этому:

import requests

params = {'key': 'MY_API_KEY'}
base_url = 'https://bigquery.googleapis.com'
project_id = 'MY_PROJECT_ID'
r = requests.get(f'{base_url}/bigquery/v2/projects/{project_id}/jobs', params=params)

К сожалению, он возвращает ответ 401, и я не могу понять, почему.

Большое спасибо и хорошего день!

Код обновления после ответа Гийома Блакьера:

from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account

base_url = 'https://bigquery.googleapis.com'
project_id = 'project_id'

credentials = service_account.Credentials.from_service_account_file(
    'service_account.json',
    scopes=['https://www.googleapis.com/auth/bigquery',
            'https://www.googleapis.com/auth/cloud-platform'],
)

authed_session = AuthorizedSession(credentials)
response = authed_session.request('GET', f'{base_url}/bigquery/v2/projects/{project_id}/jobs')
print(response.json())

# this returns : {'etag': 'tAZvk1k2f2GY8yHaQF7how==', 'kind': 'bigquery#jobList'}

1 Ответ

1 голос
/ 09 июля 2020

Ключ API больше не работает для большого количества API Google. Только некоторые устаревшие версии продолжают принимать ключ API.

Теперь вам нужен аутентифицированный запрос. Пример можно найти в документации библиотеки google-auth python . Посмотрите Refre sh и Authorized_session.

Не стесняйтесь комментировать, если вам нужна помощь по поводу учетных данных, я также могу помочь вам в этом.

EDIT

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

В вашем случае я предполагаю, что ваша учетная запись службы никогда не выполняла задание (запрос или задание загрузки), поэтому для него нет записи.

Согласно документации , вы хотите видеть все пользовательские задания , вам нужно добавить параметр ?allUsers=true в конце вашего URL

response = authed_session.request('GET', f'{base_url}/bigquery/v2/projects/{project_id}/jobs?allUsers=true')

...