Как начать работу с OAuth2 для Google Contacts API

Я пытаюсь использовать API контактов Google с аутентификацией OAuth 2. Но некоторые из старых примеров кодов теперь не работают для этого API. Я нашел пример кода, который делает запрос на токен доступа, и в ответ серверы Google давали мне токен доступа на ~ 1 час и токен обновления с. НО этот код имеет некоторые проблемы

HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
            JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();

            String APPLICATION_NAME = "PROJECT_NAME";
            String SERVICE_ACCOUNT_EMAIL = "[email protected]";
            java.io.File p12File = new java.io.File("PROJECT_NAME-NUMERICALS.p12");

            GoogleCredential credential = 
                    new GoogleCredential.Builder()                                                                    
                  .setTransport(httpTransport)                                                     
                  .setJsonFactory(jsonFactory)                                                   
                  .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)   
                  .setServiceAccountScopes(
                        Collections.singleton("https://www.google.com/m8/feeds"))                                                          
                  .setServiceAccountPrivateKeyFromP12File(p12File)                                                  
                  .setServiceAccountUser("[email protected]")
                  .build();

            if (!credential.refreshToken()) {
                throw new RuntimeException("Failed OAuth to refresh the token");
            }

            ContactsService service = new ContactsService(APPLICATION_NAME);
            service.setOAuth2Credentials(credential);

            Query gQuery = new Query(new java.net.URL("https://www.google.com/m8/feeds/groups/[email protected]/full"));
            gQuery.setMaxResults(32767);
            ContactGroupFeed groupFeed = service.query(gQuery, ContactGroupFeed.class);

            for (ContactGroupEntry group : groupFeed.getEntries()) {

И у меня возникают некоторые проблемы с этим

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant"
}
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:269)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
    at javaCode.FinalCode.main(FinalCode.java:68)

Я новичок в использовании OAuth2 для API Google, поэтому помогите мне, если я где-то ошибаюсь, или предоставьте фрагмент рабочего кода. Это было бы очень полезно. Заранее спасибо.


person Yogesh Seralia    schedule 11.08.2015    source источник
comment
Рассматривали ли вы возможность использования внешних библиотек, таких как библиотеки API Google OAuth2 для Java? — ориентирован на API Google OAuth2; Apache Oitu — реализация протокола OAuth/OAuth2. Он также охватывает другие реализации, связанные с семейством OAuth, такие как JWT, JWS и OpenID Connect. Оба имеют поддержку Maven. Другим возможным решением является CloudSponge.com, который предлагает Java API и поддержка других адресных книг.   -  person Rael Gugelmin Cunha    schedule 13.08.2015
comment
@RaelGugelminCunha еще нет! но это также хорошие варианты для обработки аутентификации OAuth. Я обязательно воспользуюсь вариантами, которые вы предложили в будущем. Но через некоторое время я справился с ситуацией, создав базовый HttpRequest и resposes   -  person Yogesh Seralia    schedule 13.08.2015


Ответы (1)


В вашем примере вы пытаетесь использовать учетную запись службы, чтобы выдать себя за пользователя. Хотя это возможно, это можно сделать только в учетных записях Google для работы или Google для образования. Это не будет работать для обычных учетных записей gmail.

Если это относится к вашему варианту использования, помните, что администратор домена должен предоставить доступ к вашему приложению, а также предоставить Делегирование полномочий на уровне домена.

Но если вы просто пытаетесь сделать какие-то тесты с API, то лучше использовать обычный OAuth.

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

Я бы рекомендовал проверить игровую площадку OAuth. Там вы можете проверить весь процесс OAuth и поиграть с API.

person Gerardo    schedule 12.08.2015
comment
OAuth Playground устранил все мои затруднения. Как разработчику Android, легко сделать простой HttpRequests и обработать ответы, аналогично я повторил с вашим предложением учебника по веб-серверу. Спасибо - person Yogesh Seralia; 13.08.2015