Раздражающие проблемы клиента Google API (Java)

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

@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 и ... он сообщает об ошибке и сообщает "Тип неизвестного поля". Итак ... я предполагаю, что это сериализация с использованием 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) Анализировать лист A B) Создавать лист B, если необходимо, и C) Уметь просматривать лист B

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


person Redmancometh    schedule 27.05.2018    source источник
comment
возможный дубликат stackoverflow.com/questions/31287911   -  person noogui    schedule 28.05.2018
comment
Итак, вкратце, то, как вы это делаете, делает учетную запись службы владельцем только что созданного листа. Я не уверен на 100%, что вы подразумеваете под основной учетной записью. Кроме того, здесь задействован G Suite или мы говорим о «обычных» учетных записях Google?   -  person Edo Akse    schedule 28.05.2018
comment
@noogui Неверно. Я уже сделал то, что пытается сделать этот человек. Моя цель совсем другая. Я даже дал 3 требования (A, B, C), чтобы проиллюстрировать этот факт. EdoAkse Я использую обычную учетную запись Google и пытаюсь просмотреть одну электронную таблицу в этой учетной записи и создать другую электронную таблицу, доступную для просмотра. Я пробовал использовать метод oAuth2, но понятия не имею, как я собираюсь авторизовать приложение для моей учетной записи на сервере. Поэтому мне нужны либо доступные документы службы acct, либо безголовый oAuth.   -  person Redmancometh    schedule 29.05.2018
comment
Итак, в этом случае я вижу 2 варианта. Один из них - создать лист с учетной записью службы и программно предоставить доступ к листу учетной записи пользователя. Недостатком является то, что учетная запись службы будет владельцем листа со всеми вытекающими из этого последствиями. Впрочем, впоследствии вы можете передать право собственности.   -  person Edo Akse    schedule 29.05.2018
comment
Другой вариант - выполнить поток OAuth2, в котором вы один раз предоставляете доступ к листам своему веб-приложению и сохраняете созданные учетные данные. Затем вы можете создавать файлы, которые принадлежат учетной записи пользователя, используя сохраненные учетные данные. Это означает, что сначала вы должны выполнить поток OAuth2, чтобы получить учетные данные, сохранить их где-нибудь, а затем использовать сохраненные учетные данные для дальнейших действий (таких как создание новых листов). Для Java доступна библиотека, и весь процесс объясняется здесь от начала до конца.   -  person Edo Akse    schedule 29.05.2018
comment
Спасибо, Эдо! Также извините за поздний ответ. Итак, я сделал дело с сервисным аккаунтом с передачей права собственности, и он отлично сработал. Сначала казалось, что поток oauth 2 работает, но он просил меня повторно авторизовать приложение в основном каждый раз, когда я его запускал, что было не очень хорошо. У учетной записи службы, похоже, нет подобных проблем, и она работает около недели подряд. Не знаю, как принять ответ, но очень признателен!   -  person Redmancometh    schedule 06.06.2018


Ответы (1)


Учетная запись службы используется для программного доступа к дате пользователя, и у нее нет собственных документов / диска. Вам необходимо указать адрес электронной почты пользователя при создании 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, вам придется использовать поток (ваш второй подход). К сожалению, для этого потребуется предоставить разрешение на доступ к документам по предоставленному URL-адресу. Вы можете сохранить токены после получения разрешения, чтобы не было необходимости повторять этот процесс.

person Daniel Przybylowski    schedule 17.07.2018