Раздражающие проблемы клиента Google API (Java) - PullRequest
0 голосов
/ 27 мая 2018

Итак, что я делаю, требует, чтобы я щелкнул документ с помощью API google sheet, взял лист, извлек из него данные и сгенерировал другой лист.Поэтому вначале я следовал примеру с использованием учетной записи службы:

@Bean(name = "google-creds")
@DependsOn(value = {"google-http-transport", "google-data-store", "json-factory"})
public GoogleCredential authorize(HttpTransport transport, JsonFactory factory) throws Exception {
    // Load client secrets.
    InputStream in = new FileInputStream(new File("config/oauth.json"));
    return GoogleCredential.fromStream(in, transport, factory).createScoped(SCOPES);
}

В моем файле oauth.json используются файлы json, созданные на вкладке учетных данных консоли API.Я создал служебную учетную запись в соответствии с инструкциями ... Я был немного сомнителен.

Я смог извлечь данные из документа, который хотел, и смог создать другой документ.Однако из того, что я могу сказать, нет никакого способа просмотреть документы, созданные с помощью учетной записи службы.Который ... я имею в виду, что делает его совершенно бесполезным.Если бы я мог просматривать эти документы из основной учетной записи, то учетная запись службы была бы создана, и это было бы замечательно.Тем не менее, некоторые ответы Google подразумевают, что это невозможно.

Итак, я решил, как насчет использования идентификатора клиента из основной учетной записи.Я загружаю предоставленный файл json и ... он выдает ошибки и говорит неизвестное поле 'type'.Так что ... я предполагаю, что это сериализация с использованием RuntimeTypeAdapter из gson или чего-то еще.Так что это совершенно несовместимо с форматом учетных данных из основной учетной записи.

Итак, в следующий раз я попытался сделать это

    @Bean(name = "google-creds")
    @DependsOn(value = {"google-http-transport", "google-data-store"})
    public Credential authorize(HttpTransport transport) throws Exception {
        // Load client secrets.
        InputStream in = new FileInputStream(new File("config/oauthnew.json"));
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in));
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(transport, factory, clientSecrets, SCOPES)
                .setDataStoreFactory(new MemoryDataStoreFactory()).build();
        Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
        return credential;
    }

Так что я на самом деле не читал об этом, и оказалось, что он создает локальный сервер причала по ... необъяснимой причине.Он также просит меня перейти по URL, который затем скулит о перенаправлениях.У меня нет желания переадресовывать что-либо или ... что-то кроме разбора и создания чертовой таблицы.Также посещение URL-адреса уже нарушает условия сделки, если для этого требуется, чтобы учетная запись уже прошла проверку подлинности.Это должно выполняться программно один раз каждые 10 минут или около того.

Кроме того, когда я использовал верхний пример, я не мог найти нигде для настройки общего доступа или разрешений в любой форме или форме.У Google обычно есть хорошие API, но это самый раздражающий API, который я использовал почти за десять лет разработки Java.Мне просто нужно уметь A) анализировать лист AB) создавать лист B при необходимости и C) иметь возможность просматривать лист B

Может ли кто-то указать мне направление, в котором я не кричу на свой монитор

1 Ответ

0 голосов
/ 17 июля 2018

Сервисная учетная запись используется для программного доступа к дате пользователя, и у нее нет собственных документов / диска.При создании GoogleCredential необходимо указать адрес электронной почты пользователя.После этого учетная запись службы получит доступ к этому пользовательскому документу (допустим, что для него включено делегирование по всему домену).В настоящее время существует открытая проблема с GoogleCredentials fromStream, пожалуйста, посмотрите (обойдите ее) https://github.com/google/google-api-java-client/issues/1007#issuecomment-318493967

Если учетная запись пользователя является учетной записью gsuite, вы можете дать разрешение учетной записи службы для областей действия черезКонсоль администратора Google https://admin.google.com/

Для получения подробной информации о делегировании домена и предоставлении доступа, пожалуйста, посмотрите https://developers.google.com/admin-sdk/directory/v1/guides/delegation

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

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

...