Ошибка несанкционированного доступа Google Bigquery 401 при использовании сервисного аккаунта

Я столкнулся с проблемой «401 Unauthorized», когда попробовал фрагмент bigquery от Майкла из этот пост на моем компьютере. . Как предложил ryguyrg, я синхронизировал время своего компьютера (нажав «обновить сейчас»), и код заработал. Но проблема в том, что через некоторое время, может быть, несколько минут, когда я перезапускал код, он снова терпел неудачу с ошибкой 401. Итак Мне приходится вручную синхронизировать время моего компьютера почти каждый раз, когда я хочу выполнить большой запрос.

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

Ниже приведено сообщение об ошибке 401 для справки:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159)
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187)
    at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115)
    at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112)
    at com.google.api.services.bigquery.Bigquery$Jobs$Insert.executeUnparsed(Bigquery.java:1418)
    at com.google.api.services.bigquery.Bigquery$Jobs$Insert.execute(Bigquery.java:1442)
    at BigQueryJavaServiceAccount.main(BigQueryJavaServiceAccount.java:83)

person Jack Guo    schedule 12.05.2012    source источник


Ответы (3)


Я бы сначала удостоверился, что ваше время синхронизировано с помощью ntpd и что оно соответствует вашему часовому поясу: http://www.ntp.org/

person Michael Manoochehri    schedule 12.05.2012

У меня была такая же проблема во время этого примера. https://cloud.google.com/bigquery/docs/quickstarts/quickstart-client-libraries

я пытался выполнить команду ниже, но произошла ошибка 401

export GOOGLE_APPLICATION_CREDENTIALS=/Users/mattheu/credentialFileName.json

Я решил проблему с учетными данными, используя ниже

String jsonPath = "/Users/mattheu/credentialFileName.json";
        GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath));
package com;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.bigquery.*;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;

public class App {
    public static void main(String[] args) throws InterruptedException, IOException {
        String jsonPath = "/Users/mattheu/credentialFileName.json";
        GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath));

        BigQuery bigquery = BigQueryOptions.newBuilder()
                .setCredentials(credentials)
                .build().getService();

        QueryJobConfiguration queryConfig =
                QueryJobConfiguration.newBuilder(
                        "SELECT "
                                + "CONCAT('https://stackoverflow.com/questions/', CAST(id as STRING)) as url, "
                                + "view_count "
                                + "FROM `bigquery-public-data.stackoverflow.posts_questions` "
                                + "WHERE tags like '%google-bigquery%' "
                                + "ORDER BY favorite_count DESC LIMIT 10")
                        // Use standard SQL syntax for queries.
                        // See: https://cloud.google.com/bigquery/sql-reference/
                        .setUseLegacySql(false)
                        .build();

        // Create a job ID so that we can safely retry.
        JobId jobId = JobId.of(UUID.randomUUID().toString());
        Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());

        // Wait for the query to complete.
        queryJob = queryJob.waitFor();

        // Check for errors
        if (queryJob == null) {
            throw new RuntimeException("Job no longer exists");
        } else if (queryJob.getStatus().getError() != null) {
            // You can also look at queryJob.getStatus().getExecutionErrors() for all
            // errors, not just the latest one.
            throw new RuntimeException(queryJob.getStatus().getError().toString());
        }

        QueryResponse response = bigquery.getQueryResults(jobId);

        TableResult result = queryJob.getQueryResults();

        // Print all pages of the results.
        for (FieldValueList row : result.iterateAll()) {
            String url = row.get("url").getStringValue();
            long viewCount = row.get("view_count").getLongValue();
            System.out.printf("url: %s views: %d%n", url, viewCount);
        }
    }
}

результат:
url: Что такое Dremel от Google? Чем он отличается от Mapreduce? просмотров: 27736
url: Невозможно получить доступ к BigQuery с локального сервера разработки App Engine просмотров: 4732
url: Как использовать функцию TABLE_QUERY() в BigQuery? просмотров: 9674
url : Миграция из неразделенных таблиц в многораздельные представления: 3549
url: Как я могу восстановить таблицу BigQuery? просмотров: 3332
url: Google App Engine: использование Большой запрос в хранилище данных? просмотров: 6928
url: Случайная выборка в Google BigQuery просмотров: 11635
url: Как использовать вставку потоковой передачи Bigquery для ядра приложения и python просмотры: 4279
url: Удалить повторяющиеся строки из таблицы BigQuery views: 8552
url: Как повысить производительность запроса GeoIP в BigQuery? просмотров: 3213

person Matthew    schedule 04.10.2018

Пара миллисекунд не должна повлиять на это.

Наибольшая вероятность сбоя будет, если время ваших запросов будет в будущем - серверы Google наверняка отклонят эти запросы.

Я согласен с предложением Майкла о синхронизации через NTP.

Мы также можем рассмотреть вопрос о том, чтобы сделать наши службы OAuth немного более мягкими, но всегда сложно сбалансировать безопасность и удобство использования.

person Ryan Boyd    schedule 12.05.2012