Программная аутентификация в Google с помощью OAuth2

Как я могу программно аутентифицироваться в Google? Теперь, когда ClientLogin ( https://developers.google.com/accounts/docs/AuthForInstalledApps) устарел, как мы можем выполнить программную аутентификацию в Google с OAuth2?

С помощью ClientLogin мы можем отправить сообщение на https://www.google.com/accounts/ClientLogin с параметрами электронной почты и паролем и получить токен аутентификации.

С OAuth2 я не могу найти решение!

#

Мое приложение представляет собой Java-фоновый процесс. По этой ссылке: developers.google.com/accounts/docs/OAuth2InstalledApp#refresh я увидел, как получить новый токен доступа с помощью обновленного токена.

Проблема в том, что я не могу найти пример Java о том, как создать экземпляр объекта Analytics (например) для выполнения запроса, когда у меня есть новый действительный токен доступа

Это мой код, который возвращает 401 недействительные учетные данные при вызове "execute()":

public class Test {

static final String client_id = "MY_CLIENT_ID";
static final String client_secret = "MY_SECRET";
static final String appName = "MY_APP";

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();

static String access_token = "xxxx";
static String refreshToken = "yyyyy";

public static void main (String args[]){

    try {

        GoogleCredential credential = 
            new GoogleCredential.Builder()
                .setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setClientSecrets(client_id, client_secret).build();
        credential.setAccessToken(access_token);
        credential.setRefreshToken(refreshToken);
        //GoogleCredential
        Analytics analytics = Analytics.builder(HTTP_TRANSPORT, JSON_FACTORY)
            .setApplicationName(appName)
            .setHttpRequestInitializer(credential)
            .build();

        Accounts accounts = analytics.management().accounts().list().execute();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

В чем проблема?

5 ответов

Решение

Проверьте поток OAuth 2 для установленного приложения:

https://developers.google.com/accounts/docs/OAuth2InstalledApp

Он все еще требует от пользователя аутентификации в браузере в первый раз, но затем вы можете сохранить токен обновления и использовать его для последующих запросов.

Для альтернативных решений проверьте поток Устройства или Сервисные учетные записи, они объяснены в том же наборе документации.

Я обнаружил, что клиент Google Java слишком сложен и плохо документирован. Вот простой и простой пример сервлета с Google Oauth2. Для фонового процесса вам нужно запросить access_type=offline. Как уже упоминали другие, пользователь должен сделать одноразовую авторизацию. После этого вы можете запросить обновления токенов, так как срок действия токенов Google истекает через час.

Хотя я понимаю, что OP изначально был нацелен на подход OAuth2InstalledApp, я хотел бы указать на работающее решение, использующее подход OAuth2WebServer. Они не отличаются значительно, и это сработало для меня. Я обнаружил, что библиотека Google OAuth довольно хороша, поскольку она будет обрабатывать большинство танцев OAuth для вас и с ее помощью будет легко обновлять токен доступа. Приведенное ниже решение зависит от использования предварительно полученного токена обновления.

Как гласит принятый ответ, чтобы заставить работать аутентификацию OAuth (даже для фонового процесса Java), когда запрос опирается на доступ к пользовательским данным

требует от пользователя аутентификации в браузере в первый раз, но затем вы можете сохранить токен обновления и использовать его для последующих запросов.

Из предыдущих комментариев ОП я вижу следующее

Поэтому я следовал OAuth2 для приложений веб-сервера (здесь автономный доступ задокументирован), но у меня все еще есть проблемы.
1) Я выполняю первый запрос через браузер и получаю аутентификационный код для автономного доступа
2) Я выполняю Java-пост кода аутентификации и получаю токен доступа и обновляю токен

Подход, который я использовал, больше похож на

1) Я выполняю первый запрос через браузер и получаю токен обновления для автономного доступа.
2) В Java я предоставляю токен обновления для библиотеки, и библиотека получит токен доступа и т.д.

в частности, используя библиотеку google-api-java-client, этот код довольно прост, и обратите внимание, что я не установил токен доступа, как OP, как я звоню credential.refreshToken(); в другом месте. (Я проверяю, есть ли у меня действительный токен доступа, и если нет, то вызовите обновление до вызова API)

  private Credential generateCredentialWithUserApprovedToken() throws IOException,
      GeneralSecurityException {
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    InputStreamReader inputStreamReader =
        new InputStreamReader(jsonFileResourceForClient.getInputStream());
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, inputStreamReader);
    return new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory)
        .setClientSecrets(clientSecrets).build().setRefreshToken(REFRESH_TOKEN);
  }

Обратите внимание, что это покрывает шаг 2 моего подхода и REFRESH_TOKEN упомянутый в шаге 1 может быть получен как объяснено ниже.

Сначала выполняется предварительная настройка веб-приложения, создающего идентификатор клиента OAuth 2.0 на консоли Google для учетных данных, в результате чего вы получаете загруженный файл json, который будет считан в GoogleClientSecrets объект.

т.е.

Убедитесь, что вы добавили URI обратного вызова игровой площадки Google в URI авторизованного перенаправления

Затем у вас есть свой идентификатор клиента и секрет клиента, готовый для игровой площадки, и вы также можете загрузить json, который вы можете вставить в свой код Java.

REFRESH_TOKEN получается путем отправки запроса на игровую площадку Google oauth со следующей конфигурацией. Обратите внимание, что до шага 1 и выбора своей области вы должны перейти в настройки, чтобы проверить, что вы предоставляете свои собственные учетные данные и добавить свой идентификатор клиента и секретный ключ чуть ниже

Обратите внимание, что тип доступа Offline, что соответствует этому.

Здесь также есть хорошее объяснение о том, как получить токен обновления https://www.youtube.com/watch?v=hfWe1gPCnzc

Этого достаточно, чтобы начать работу, и это настроено один раз!

Что касается токенов обновления, вы должны знать об их жизненном цикле, как описано в документации здесь.

В oauthplayground вы увидите это

но в пункте 4 документации здесь говорится это

Хммм.

Также для справки см. Как авторизовать приложение (веб или установленное) без вмешательства пользователя? (канонический?)

Я задокументировал пример использования Javascript и получения токена авторизации здесь

http://www.alexroque.com/?p=307

Надеюсь, это поможет. Что вы хотите сделать, это убедиться, что наш возвращаемый URI правильно настроен в вашей консоли API и что вы правильно анализируете токен из ответа.

Для приложений, которые аутентифицируются от своего имени (то есть, для другого приложения, традиционно путем входа в учетную запись роли с использованием общего пароля), альтернативой OAuth2 для ClientLogin, предлагаемой Google, является служебные учетные записи:

https://developers.google.com/accounts/docs/OAuth2ServiceAccount

Другие вопросы по тегам