Google OAuth 2.0 серверный доступ к Google Drive - PullRequest
0 голосов
/ 17 октября 2018

Я создал пользователя с доступом к определенному диску Google.Через приложение Spring Boot (jhipster) я подключаюсь с этим пользователем к G-Drive.Моя проблема - аутентификация.Я использую этот код для аутентификации (как в примерах, которые Google предоставляет для веб-приложений):

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
    HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
    .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(".")))
    .setApprovalPrompt("auto")
    .build();
return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");

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

Пожалуйста, откройте следующий адрес в своем браузере:
https://accounts.google.com/o/oauth2/auth?...

Поскольку я не могу сделать это из экземпляра EC2, я делаю это на своем локальном компьютере и загружаю файл в ожидаемое место с сервера.Наконец, перезапуск заставляет веб-сервер работать некоторое время, пока токен не истечет.После этого я должен сделать ту же процедуру.

Очевидно, что я здесь что-то не так делаю.Какова правильная процедура подключения веб-приложения к G-Drive каждые несколько минут?

ОБНОВЛЕНИЕ: Я обнаружил (https://cloud.google.com/storage/docs/authentication), что я должен использовать служебную учетную запись, как предлагает ссылка дляОблачное хранилище. К сожалению, я скачал json для служебной учетной записи, установил переменную env, но похоже, что она не работает для gi-fi rest rest api (v3).

Спасибо

1 Ответ

0 голосов
/ 19 октября 2018

спасибо за ввод, но я наконец нашел свой ответ.Из примеров я использовал код для установленных приложений (автономные приложения).

Вместо этого я должен был использовать «учетную запись службы».Это можно легко создать из обычной учетной записи пользователя Google.Вы получите JSON и должны указать полный путь к этому файлу json в переменной среды GOOGLE_APPLICATION_CREDENTIALS

Более подробную информацию можно найти здесь: https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Как только у вас появится GoogleCredentialobject, остальная часть примера кода остается прежней.

EDIT: Использование решения, которое я описал ранее "Установленное приложение" / "Автономное приложение", подходит для демонстрационных целей, где естьэто пользователь, который фактически нажимает на ссылку, которая появляется, и чтобы обновлять токен с истекшим сроком действия каждые 60 минут или около того.

Правильное решение - использовать служебную учетную запись и выдавать себя за родительскую учетную запись (с кем вы создали учетную запись службы).Вот пример:

    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(HTTP_TRANSPORT)
        .setJsonFactory(GCredentials.JSON_FACTORY)
        .setServiceAccountId("xxxxxx@xyz.iam.gserviceaccount.com")
        .setServiceAccountUser("This is the email of the real user that you want to impersonate")
        .setServiceAccountProjectId("The project ID")
        .setServiceAccountPrivateKeyFromP12File(p12File)
        .setServiceAccountScopes(SCOPES)
        .build();

Администратор должен предоставить вам соответствующие права (ОБЛАСТИ), которые вы объявляете, и это должно быть сделано с использованием идентификатора КЛИЕНТА наконсоль администратора.

Также вы должны убедиться, что учетная запись, которую вы олицетворяете, является членом папки g-drive.Это не требуется для учетной записи службы.Имя проекта также должно быть правильным при создании экземпляра DriveService.Я надеюсь, что это поможет многим людям и позволит не тратить много времени на успешное подключение.

...