Google Drive / OAuth - не могу понять, как получить повторно используемые GoogleCredentials

Я успешно установил и запустилПриложение Google Drive Quick Start под названием DriveCommandLine, Я также немного адаптировал его для получения информации о файле для одного из файлов в моей учетной записи Drive.

Теперь я хотел бы как-то сохранить учетные данные и использовать их повторно, чтобы пользователю не приходилось каждый раз заходить на веб-страницу, чтобы получить код авторизации. Я проверилэта страница с инструкциями для получения и использования учетных данных OAuth 2.0. Чтобы использовать пример класса (MyClass), я изменил строку в DriveCommandLine, где создается экземпляр объекта Credential:

Credential credential = MyClass.getCredentials(code, "");

Это приводит к следующему исключению:

java.lang.NullPointerException
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:187)
    at com.google.api.client.json.jackson.JacksonFactory.createJsonParser(JacksonFactory.java:84)
    at com.google.api.client.json.JsonFactory.fromInputStream(JsonFactory.java:247)
    at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.load(GoogleClientSecrets.java:168)
    at googledrive.MyClass.getFlow(MyClass.java:145)
    at googledrive.MyClass.exchangeCode(MyClass.java:166)
    at googledrive.MyClass.getCredentials(MyClass.java:239)
    at googledrive.DriveCommandLine.<init>(DriveCommandLine.java:56)
    at googledrive.DriveCommandLine.main(DriveCommandLine.java:115)

Я изучал эти API (Google Drive и OAuth) уже 2 дня и добился очень незначительного прогресса. Я очень признателен за некоторую помощь в связи с вышеуказанной ошибкой и проблемой получения постоянных учетных данных в целом.

Вся эта структура кажется мне излишне сложной. Кто-нибудь хочет объяснить, почему я не могу просто создать простой объект Credential, введя свое имя пользователя и пароль Google?

Спасибо, Брайан О Кэрролл, Дублин, Ирландия

* Update *

Хорошо, я только что обошел вышеупомянутую ошибку, и теперь у меня есть новая.

Первая проблема была решена путем изменения MyClass.getFlow (). Вместо создания объекта GoogleClientServices из файла json я использовал другую версию GoogleAuthorizationCodeFlow.Builder, которая позволяет вводить идентификатор клиента и секрет клиента непосредственно в виде строк:

flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, "<MY CLIENT ID>", "<MY CLIENT SECRET>", SCOPES).setAccessType("offline").setApprovalPrompt("force").build();

Проблема, с которой я столкнулся сейчас, заключается в том, что я получаю следующую ошибку при попытке использовать поток (объект GoogleAuthorizationCodeFlow) для обмена кодом авторизации для объекта Credentials:

An error occurred: com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_scope"
}
googledrive.MyClass$CodeExchangeException
        at googledrive.MyClass.exchangeCode(MyClass.java:185)
        at googledrive.MyClass.getCredentials(MyClass.java:262)
        at googledrive.DriveCommandLine.<init>(DriveCommandLine.java:56)
        at googledrive.DriveCommandLine.main(DriveCommandLine.java:115)

Есть ли какая-то другая область, которую я должен использовать для этого? В настоящее время я использую массив областей, предоставляемых с MyClass:

private static final List<String> SCOPES = Arrays.asList(
        "https://www.googleapis.com/auth/drive.file",
        "https://www.googleapis.com/auth/userinfo.email",
        "https://www.googleapis.com/auth/userinfo.profile");

Спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос