Авторизация при использовании клиентов BigQuery API - PullRequest
0 голосов
/ 25 марта 2020

У меня есть некоторые данные в BigQuery. Я хочу иметь возможность запрашивать эти данные динамически, используя веб-страницу с пользовательским вводом и элементами управления. Например, пользователь может выбрать некоторые параметры из выпадающего списка, которые затем go включат, чтобы создать запрос SQL, который я отправляю в запросе REST в API BigQuery.

Я пытаюсь решить, как упростить или удалить авторизацию, необходимую для выполнения этих запросов с помощью API. Я не хочу, чтобы пользователю приходилось входить в систему, используя свою учетную запись Google, чтобы авторизовать запрос API - этот сайт будет внутренним, а доступ уже будет контролироваться через Identity Aware Proxy на GCP. Кажется, проблема в том, что метод в API BQ, который я хочу использовать (https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query), нуждается в областях авторизации, которые я должен получить, выполнив вход в систему пользователя.

Я очевидно, уже предоставив ключ API и идентификатор клиента для запроса - зачем также необходима авторизация для входа в систему?

<script>
var results;

  function authenticate() {
    return gapi.auth2.getAuthInstance()
        .signIn({scope: "https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/bigquery.readonly https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/cloud-platform.read-only"})
        .then(function() { console.log("Sign-in successful"); },
              function(err) { console.error("Error signing in", err); });
  }
  function loadClient() {
    gapi.client.setApiKey("KEY");
    return gapi.client.load("https://content.googleapis.com/discovery/v1/apis/bigquery/v2/rest")
        .then(function() { console.log("GAPI client loaded for API"); },
              function(err) { console.error("Error loading GAPI client for API", err); });
  }


  // Make sure the client is loaded and sign-in is complete before calling this method.
  function execute() {
    return gapi.client.bigquery.jobs.query({
      "projectId": "PROJECT-ID",
      "prettyPrint": true,
      "alt": "json",
      "resource": {
        "query": "SELECT * FROM `TABLE` where Division = 'ERLT Local (Majors)' LIMIT 100",
        "location": "europe-west2",
        "useLegacySql": false,
        "kind": "bigquery#queryRequest"
      }
    })
        .then(function(response) {
                var results = response.result.rows;
                console.log(results);
              },
              function(err) { console.error("Execute error", err); });
  }
  gapi.load("client:auth2", function() {
    gapi.auth2.init({client_id: "CLIENT-ID.apps.googleusercontent.com"});
  });
</script>


<button onclick="authenticate().then(loadClient)">authorize and load</button>
<button onclick="execute()">execute</button>

Как показано выше, пользователь должен в настоящее время нажать кнопку авторизации и загрузки перед выполнением запрос. Как я могу удалить этот шаг?

1 Ответ

1 голос
/ 26 марта 2020

Я хочу иметь возможность динамически запрашивать эти данные, используя веб-страницу с пользовательскими входами и элементами управления.

Требуемая функциональность может быть построена на веб-сервере, который обращается к BQ с использованием учетной записи службы GCP. , Учетная запись может быть создана с помощью пользовательского интерфейса или с помощью команды:

gcloud iam service-accounts create <sa-name> --display-name "<sa-name>" --description "Service account for BQ read-only access"

Затем предоставьте учетной записи службы разрешение на запуск заданий:

gcloud projects add-iam-policy-binding <project-name> --member=serviceAccount:<sa-name>@<project-name>.iam.gserviceaccount.com --role roles/bigquery.jobUser

Замените заполнители: <sa-name> - заменить на имя учетной записи службы, <project-name> - заменить на имя проекта.

Обратите внимание, что учетной записи службы потребуется дополнительное разрешение для чтения набора данных.

Это решение позволяет встроить параметризованный запрос. в веб-сервер. Конечные пользователи используют браузер для необязательной установки параметров запроса, запуска запроса и получения результатов. Я - автор.

Я не хочу, чтобы пользователь должен был входить в систему, используя свою учетную запись Google

Пользователям не нужно иметь учетные записи GCP. Веб-сервер использует учетную запись службы.

Например, пользователь может выбрать из выпадающего списка некоторые параметры, которые затем go включат для создания SQL запроса

Это то, что делает решение. Однако из соображений стоимости и безопасности конечным пользователям разрешается только создавать предложение WHERE запроса. Вы можете изменить код так, чтобы он содержал несколько запросов SQL, и тогда раскрывающийся список позволит выбрать, какой запрос использовать, другой раскрывающийся список может установить некоторые параметры запроса и т. Д. c.

...