IllegalArgumentException при доступе к Google Sheets API - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь читать / писать в Google Sheet (принадлежит мне) через Google Sheets API v4. Для получения объекта Credential я использую следующий код:

private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {

    // Load client secrets.
    InputStream in = ResourceX.class.getResourceAsStream(CLIENT_SECRET_DIR);
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    System.out.println(clientSecrets.toPrettyString());
    // When I print this ^^ it loads contents of secret key exactly as expected

    // Build flow and trigger user authorization request.
    Builder builder = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES); // error occurs on this line
            builder.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(CREDENTIALS_FOLDER)));
            GoogleAuthorizationCodeFlow flow = builder.setAccessType("offline").build();
    return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
}

Я понимаю, что IllegalArgumentException означает, что каким-то образом аргумент clientSecrets является недопустимым для передачи в качестве параметра, однако, когда я распечатываю содержимое файла json (см. Оператор print в коде выше), содержимое, кажется, соответствует ожидаемому содержимому. (Я не могу распечатать содержимое на SO из соображений безопасности, но в файле ничего не изменилось, так как я скачал его с Google).

Я нашел похожий вопрос здесь , но нет ответов на основной вопрос.

Что, возможно, я пропустил, что может вызвать это исключение?

StackTrace

Exception in thread "main" java.lang.IllegalArgumentException
    at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111)
    at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37)
    at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.getDetails(GoogleClientSecrets.java:82)
    at com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow$Builder.<init>(GoogleAuthorizationCodeFlow.java:195)
    at global_projects.GoogleSheetsAPI.getCredentials(GoogleSheetsAPI.java:100)
    at global_projects.GoogleSheetsAPI.updateSheetByOauth2(GoogleSheetsAPI.java:116)
    at amz.Main.main(Main.java:78)

Обновление:

Я думаю, что нашел проблему. clientSecrets ожидает, что файл json из идентификатора клиента OAuth 2.0 не является служебной учетной записью ключ / jsonfile (как описано в этой ссылке ). Однако, поскольку я обращаюсь к своей собственной электронной таблице, есть ли способ получить к ней доступ, используя файл ключ учетной записи службы / файл json , или я должен использовать OAuth , что потребовало бы от меня согласия на редактирование моя собственная таблица?

1 Ответ

0 голосов
/ 12 июня 2018

Существует два способа доступа к файлу листов Google с помощью API клиента Google.

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

OR

  1. Создание учетных данных идентификатора клиента Oauth2 для использования при создании объекта учетных данных. Этот метод предложит вам с помощью обратного URL предоставить авторизацию в браузере. После того, как вы одобрите, вы можете запросить токен обновления, который позволит вам обновить свой токен доступа без повторного утверждения потока браузера.

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

...