Я успешно установил и запустил приложение быстрого запуска Google Диска под названием DriveCommandLine. Я также немного адаптировал его для получения информации о файле для одного из файлов в моей учетной записи накопителя.
Теперь я хочу сохранить учетные данные и повторно использовать их без необходимости посещать веб-страницу каждый раз, чтобы получить код авторизации. Я проверил эту страницу с инструкциями по извлечению и использованию учетных данных OAuth 2.0. Чтобы использовать класс example (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 Диск и OAuth) уже 2 дня и добился очень большого прогресса. Я бы очень признателен за помощь в вышеупомянутой ошибке и проблеме получения постоянных учетных данных в целом.
Вся эта структура кажется мне излишне сложной. Кто-нибудь хочет объяснить, почему я не могу просто создать простой объект Credential, передав свое имя пользователя и пароль Google?
Спасибо, Брайан О Кэрролл, Дублин, Ирландия
* Обновление *
Хорошо, я только что обошел вышеупомянутую ошибку, и теперь у меня есть новая.
То, как я столкнулся с первой проблемой, - это изменить 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");
Спасибо!