Подтвердить что ты не робот

Автоматически аутентифицировать 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();
    } 
}

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

в частности, используя google-api-java-client library код довольно прост и обратите внимание, что я не установил доступ как это сделал 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.

то есть.

введите описание изображения здесь

Убедитесь, что вы добавили URL-адрес обратного вызова Google в авторизованные URI-адреса перенаправления.

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

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

Есть также приятное объяснение при захвате токена обновления здесь https://www.youtube.com/watch?v=hfWe1gPCnzc

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

Хммм.

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

Ответ 4

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

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

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

Ответ 5

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

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