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");
Спасибо!