Программная аутентификация в 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();
    } 
}

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


person Andrea Zonzin    schedule 31.05.2012    source источник
comment
Я задокументировал пример использования Javascript и получения токена авторизации здесь alexroque.com/?p=307 Надеюсь, это поможет. Что вы хотите сделать, так это убедиться, что наш возвращаемый URI правильно настроен в вашей консоли API и что вы правильно анализируете токен из ответа.   -  person AlexR    schedule 29.04.2013
comment
не могли бы вы опубликовать свое решение и способы его решения. У меня такая же проблема   -  person Reddy    schedule 25.09.2013
comment
не могли бы вы опубликовать код вашего решения.   -  person Ninad    schedule 12.12.2014
comment
Для тех, кто ищет решение, я опубликовал его в качестве ответа stackoverflow.com/a/34561285/752167   -  person Matt C    schedule 03.01.2016


Ответы (4)


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

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

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

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

person Claudio Cherubino    schedule 31.05.2012
comment
Я проверяю поток OAuth 2 для установленного приложения, но он не объясняет, как обновить токен доступа и как выполнить автономный доступ (мне нужен автономный доступ для моего процесса bacgrond). Итак, я использовал OAuth2 для приложений веб-сервера (здесь документирован автономный доступ), но у меня все еще есть проблемы. 1) Я выполняю первый запрос через браузер и получаю код аутентификации для автономного доступа 2) Я выполняю java-сообщение кода аутентификации и получаю токен доступа и обновляю токен - person Andrea Zonzin; 02.06.2012
comment
Вот как вы используете токен обновления для получения нового токена доступа: developers.google.com / accounts / docs / OAuth2InstalledApp # обновить - person Claudio Cherubino; 02.06.2012
comment
Я изменяю свой вопрос с помощью примера кода, чтобы лучше объяснить мою проблему - person Andrea Zonzin; 02.06.2012
comment
Ознакомьтесь с руководством по Java для Google Диска, чтобы получить полный пример, показывающий, как решать все крайние случаи в потоке OAuth: developers.google.com/drive/examples/java - person Claudio Cherubino; 02.06.2012
comment
В руководстве по работе с диском Google рассказывается о веб-приложении и пользовательском сеансе. Мне нужен автономный доступ для загрузки данных в запланированном фоновом процессе. - person Andrea Zonzin; 03.06.2012
comment
Большое спасибо Клаудио. С помощью руководства по Google Диску я нашел ответы на все свои проблемы! Просто вопрос: в руководстве используются классы com.google.api.services.oauth2.Oauth2 и com.google.api.services.oauth2.model.Userinfo для получения информации о пользователе. В последнем google-api-java-client этих классов нет. Вы знаете, как я могу получить информацию о пользователе с помощью нового клиента google-api-java-client? - person Andrea Zonzin; 03.06.2012
comment
Банка должна быть доступна здесь: code.google.com / p / google-api-java-client / wiki / API # oauth2 - person Claudio Cherubino; 03.06.2012
comment
$ Андреа, если ты нашел решение, другим было бы полезно увидеть, чем оно в итоге закончилось. Ответьте на вопрос, что сработало, и примите это! - person MuffinTheMan; 07.04.2013
comment
@ClaudioCherubino Я был бы очень рад, если бы вы помогли мне с stackoverflow.com/questions/23010509/ На данный момент я понял, что могу также использовать ваше второе решение. - person Skynet; 11.04.2014
comment
Я добавил некоторые подробности в качестве ответа stackoverflow.com/a/34561285/752167 - person Matt C; 02.01.2016

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

person Andrew    schedule 26.10.2013
comment
Их документация, безусловно, может быть разочаровывающей и непрозрачной, но клиент Java для OAuth, предоставляемый Google, делает многое для вас за кулисами. Сказав это, я согласен, что это слишком сложно в реализации, и приведенный выше пример действительно полезен и прекрасно передает поток OAuth в Java. В любом случае, пожалуйста, посмотрите мой ответ, показывающий, как можно использовать клиент Google stackoverflow.com/a/34561285/752167 - person Matt C; 02.01.2016
comment
Работает ли приведенный выше пример? Я пробовал, я не получаю заголовок «Access-Control-Allow-Origin» на запрошенном ресурсе. Следовательно, к источнику "localhost: 2828" не разрешен доступ. В ответе был код статуса HTTP 405. @Andrew. Спасибо за помощь - person therealprashant; 25.04.2018

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

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

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

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

Итак, я использовал 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.

i.e.

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

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

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

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

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

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

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

Обратите внимание, что тип доступа - Автономный, что соответствует этому.

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

Этого достаточно, чтобы начать работу, и настройка выполняется один раз!

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

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

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

но в пункте 4 документов здесь говорится следующее

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

Хм.

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

person Matt C    schedule 01.01.2016
comment
Я получил токен обновления, выполнив Java Quickstart, который открывает браузер и предлагает пользователю войти в систему. После этого вы можете увидеть токен обновления, например, в отладчике. Вроде грязный хакер, но что ж ... работает. - person Tim Büthe; 14.05.2016
comment
Вы сделали мой день. искал это с последних двух выходных. Не забудьте добавить developers.google.com/oauthplayground в uri перенаправления вместо developers.google.com/oauthplayground (в конце косая черта) - person NameNotFoundException; 03.12.2016
comment
Какой тип данных jsonFileResourceForClient и что это такое? - person Taochok; 05.10.2017
comment
Я отвечу сам, jsonFileResourceForClient - это client_secrets.json в InputStreamReader. У меня это сработало: new InputStreamReader(OAuth2TestV2.class.getResourceAsStream("/client_secrets.json"),"UTF-8") вместо new InputStreamReader(jsonFileResourceForClient.getInputStream()); - person Taochok; 06.10.2017

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

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

person breno    schedule 21.09.2012