#google-apps-script #google-bigquery #authorization #urlfetch
#google-apps-script #google-bigquery #авторизация #urlfetch
Вопрос:
Я работаю в Google script API, пытаясь получить схему таблицы из BiqQuery… не уверен, почему это так хлопотно.
Я отправляю запрос, подобный этому :
let url = 'https://bigquery.googleapis.com/bigquery/v2/projects/' projectId '/datasets/' datasetId '/tables/' tableId;
var response = UrlFetchApp.fetch(url)
Я получаю этот ответ:
Исключение: ошибка запроса для https://bigquery.googleapis.com возвращенный код 401. Усеченный ответ сервера: { «ошибка»: { «код»: 401, «сообщение»: «В запросе отсутствуют необходимые учетные данные для аутентификации. Ожидается токен доступа OAuth 2, файл cookie для входа… (используйте опцию muteHttpExceptions для проверки полного ответа) (строка 68, файл «BigQuery»)
Я смог нормально загрузить данные в BigQuery… не уверен, почему это не работает. Я просмотрел поля OAuth в манифесте, и у скрипта действительно есть доступ к BigQuery…
также не удалось добавить это в поле параметров запроса UrlFetch
var authHeader = 'Basic ' Utilities.base64Encode(USERNAME ':' PASSWORD);
var options = {
headers: {Authorization: authHeader}
}
Комментарии:
1. Базовая аутентификация не содержит информации о областях OAuth, попробуйте использовать токен на предъявителя. 1. получите токен через
ScriptApp.getOAuthToken()
и отправьте его какBearer <token here>
.2. @Oleg Valter — спасибо! это сработало — идеально. По какой причине мои другие функции, адресующие BigQuery, работают, и этому HTTP-запросу понадобился этот дополнительный токен? Таким образом, я успешно получил схему таблицы из BigQuery. Это самый чистый способ добиться этого?
3. макмак, ну, для среды Google Apps Script существует продвинутый сервис, который использует BigQuery REST API специально для GAS: developers.google.com/apps-script/advanced/bigquery , поэтому вам не нужно беспокоиться о таких вещах, как аутентификация или синтаксический анализ ответа. Лично мне не слишком нравятся продвинутые сервисы, но они действуют как своего рода полезные библиотеки. P.s. Рад, что смог вам помочь
4. Что касается других вызовов API — я не уверен, мое лучшее предположение заключается в том, что они не требуют аутентификации. Если вы предоставите больше информации о конечных точках, которые позволили вам запрашивать их без токена предъявителя, я могу с уверенностью сказать и / или протестировать
5. @Oleg Valter Я смог загрузить BigQuery.Jobs.insert(loadJob, ProjectID, blob); И я полагаю, что все надлежащие вызовы API также будут работать. Для поиска схемы таблицы, хотя я не смог найти ничего, кроме HTTP-запроса. Или вызов «bq show» для командной строки (который предположительно просто выполняет запрос REST Api, хотя я не смог его восстановить)
Ответ №1:
Используйте токены на предъявителя
Причина, по которой BigQuery API отклоняет ваши запросы, заключается в том, что конечная точка требует, чтобы одна из следующих областей была снабжена токеном доступа для работы, а он отсутствует в запросе:
https://www.googleapis.com/auth/bigquery
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/bigquery.readonly
https://www.googleapis.com/auth/cloud-platform.read-only
Фактическая проблема здесь заключается в том, что в базовой схеме авторизации отсутствует информация о каких-либо заявлениях, только отправка правильных учетных данных. Поскольку вы запрашиваете конечную точку напрямую через UrlFetch
сервис, несмотря на правильное указание областей в манифесте, они не будут отправлены.
ScriptApp
теперь сервис предоставляет простой способ получить действительный токен на предъявителя без использования библиотеки OAuth 2.0 или построения потока с нуля: getOAuthToken
. Передайте его в Authorization
заголовок в качестве токена на предъявителя, и все должно быть готово:
const token = ScriptApp.getOAuthToken();
const options = {
headers : {
Authorization : `Bearer ${token}`
}
};
Используйте расширенный сервис
В качестве альтернативы существует официальный расширенный сервис в виде оболочки вокруг BigQuery REST API, который будет управлять аутентификацией и анализом ответов для вас.
Вы должны включить расширенную службу BigQuery перед ее использованием
Также обратите внимание, что идентификатор расширенной службы настраивается, поэтому вы должны ссылаться на выбранный вами идентификатор.
В вашем случае сервис можно использовать следующим образом (при условии, что вы использовали BigQuery
идентификатор по умолчанию). Существует также 4-й аргумент типа object
, который содержит необязательные аргументы (здесь не показаны):
Bigquery.Tables.get("projectId","datasetId", "tableId");
Приведенная выше цепочка методов соответствует tables.get
методу BigQuery API.
Комментарии:
1. Я думаю, я был немного размыт в отношении разницы между REST API и расширенным сервисом. Все еще немного размыто — я определенно был на странице метода tables.get много раз, пытаясь решить эту проблему. Существует ли аналогичная документация для расширенного сервиса? Это, очевидно, то, что я хочу использовать (предложенный вами вызов сработал). Я понимаю, что модуль script (ваш последний комментарий к вопросу) отчасти помогает ориентироваться во время кодирования. (Я нахожусь в редакторе Google, поэтому он есть по умолчанию).
2. @makmak — к сожалению, для каждого продвинутого сервиса Google указывает на то, что делает REST API, поэтому я не думаю, что есть какая-либо документация по сервису (могут быть неофициальные, но я не знаю ни о каком). Самое близкое, что вы можете сделать, это буквально проверить
ts
файл или создать собственный JSDoc, но это не стоит затраченных усилий…