Процедура использования токенов OAuth в Google App Engine - PullRequest
4 голосов
/ 04 мая 2011

У меня есть приложение с клиентской стороной, работающей на Android, и сервером, развернутым в Google App Engine.Приложение будет использовать пользовательские данные Календаря Google и нуждается в аутентификации в службе Календаря для доступа к каналам.Я могу обрабатывать получение токенов OAuth и секретов токенов от каждого пользователя на клиенте и сохранять их в базе данных на сервере для использования при доступе к каналам.Когда я пытаюсь использовать их для аутентификации в службе календаря, у меня возникают проблемы.

Сначала я использовал библиотеки gdata для этого , следуя этому примеру :

import com.google.gdata.client.calendar.*;
import com.google.gdata.client.authn.oauth.*;

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
oauthParameters.setOAuthToken(ACCESS_TOKEN);
oauthParameters.setOAuthTokenSecret(TOKEN_SECRET);

CalendarService client = new CalendarService("yourCompany-YourAppName-v1");
client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());

URL feedUrl = new URL("https://www.google.com/calendar/feeds/default/freebusy/busy-times"+username);
CalendarEventFeed resultFeed = service.getFeed(eventFeedUrl,CalendarEventFeed.class);

System.out.println("All events on your calendar:");
System.out.println();
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
   CalendarEventEntry entry = resultFeed.getEntries().get(i);
   System.out.println("\t" + entry.getTitle().getPlainText());
}
System.out.println();

Однако это вызвало исключения:

java.lang.NoClassDefFoundError: com/google/gdata/client/authn/oauth/OAuthParameters

, хотя библиотеки были правильно связаны.Я провел несколько онлайн-исследований и обнаружил сообщение, в котором говорится, что движку приложений больше не нравятся библиотеки gdata, и я предпочитаю новый google-api-java-client от Google, Клиентская библиотека API Google для Java

Поэтому я переписал код для использования этой библиотеки, надеясь, что это решит мою проблему.Используя их пример кода и заменив их соответствующими учетными данными:

import com.google.api.client.auth.oauth.*;
import com.google.api.client.googleapis.*;
import com.google.api.client.googleapis.json.*;
import com.google.api.client.http.*;
import com.google.api.client.util.*;
import java.io.*;

// authorize using OAuth
HttpTransport transport = GoogleTransport.create();
transport.addParser(new JsonCParser());
OAuthParameters parameters = new OAuthParameters();
parameters.consumerKey = "anonymous";
parameters.token = "...";
OAuthHmacSigner signer = new OAuthHmacSigner();
signer.clientSharedSecret = "anonymous";
signer.tokenSharedSecret = "...";
parameters.signer = signer;
parameters.signRequestsUsingAuthorizationHeader(transport);

Однако теперь я получаю сообщение об ошибке при вызове GoogleTransport.create ().Я заглянул в API для GoogleTransport и прочитал: Предупреждение: в версии 1.1 больше не планируется расширять HttpTransport, поэтому, похоже, это источник моей ошибки.

Итак, я перехожу кВы все за помощь в решении этой проблемы.Исходя из того, что я обсуждал выше, и как я могу использовать токены доступа и секреты токенов, которые есть у каждого пользователя для аутентификации в Google и доступа к его фидам Календаря?

1 Ответ

2 голосов
/ 07 мая 2011

Хорошо, моя первая попытка была правильной, и это все еще можно сделать с помощью библиотек gdata.Проблема заключалась в том, что Eclipse не включил несколько библиотек в мой путь сборки для загрузки при загрузке проекта на его размещенный сайт.Я также не включил google-collect-1.0-rc1.jar, расположенный в папке зависимостей deps, которая является обязательной.В случае, если эта проблема беспокоит кого-то еще, убедитесь, что то, что я обсуждал выше, покрыто, и следующий код должен работать для вас, чтобы изменить, как вам нужно:

    URL feedUrl;
    try {
        /* Setup the request for retrieving events for a given day */
        feedUrl = new URL("https://www.google.com/calendar/feeds/default/private/full");    
        CalendarQuery myQuery = new CalendarQuery(feedUrl);
        myQuery.setMinimumStartTime(DateTime.parseDateTime("2011-05-07T00:00:00"));
        myQuery.setMaximumStartTime(DateTime.parseDateTime("2011-05-07T23:59:59"));

        /* Setup OAuth parameters to include in the request */
        GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
        oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
        oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
        oauthParameters.setOAuthToken(token);
        oauthParameters.setOAuthTokenSecret(token_secret);

        /* Send the request */
        service.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());
        CalendarEventFeed myFeed = service.getFeed(myQuery, CalendarEventFeed.class);

        /* Process the request */
        CalendarEntry entry;
        for (int i = 0; i < myFeed.getEntries().size(); i++) {
          entry = myFeed.getEntries().get(i);
          System.out.println(entry.getTitle().getPlainText());
        }           
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (OAuthException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ServiceException e) {
        e.printStackTrace();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...