Доступ к Google Диску на стороне сервера Google OAuth 2.0

Я создал пользователя с доступом к определенному диску 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, но похоже, что это не работает для api google drive rest (v3).

Спасибо


person Investigator    schedule 17.10.2018    source источник
comment
stackoverflow.com/questions/19766912/   -  person pinoyyid    schedule 19.10.2018


Ответы (1)


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

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

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

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

РЕДАКТИРОВАТЬ: Использование решения, которое я описал перед «Установленное приложение» / «Автономное приложение», подходит для демонстрационных целей, когда пользователь действительно нажимает на всплывающую ссылку, чтобы обновлять истекший токен каждые 60 минут или около того.

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

    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(HTTP_TRANSPORT)
        .setJsonFactory(GCredentials.JSON_FACTORY)
        .setServiceAccountId("[email protected]")
        .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. Я надеюсь, что это поможет многим людям и не тратит много времени на попытки успешно подключиться.

person Investigator    schedule 19.10.2018
comment
Нужно ли для этого создавать учетную запись g-suite? - person Razebond; 19.07.2020
comment
Привет, @Razebond, хотя я давно не работал с этой проблемой, да, я могу вспомнить, что все учетные записи были g-suite. - person Investigator; 20.07.2020