Google Contacts v3 API & OAuth v2, в Java

В течение последних нескольких дней я пытался получить список контактов google, используя вышеуказанные API. Иглы сказать, безуспешно. Документация Google (которая является полным беспорядком, если я могу сказать) не очень помогла мне в решении моей проблемы. Дело в том, что я понятия не имею, как авторизовать объект ContactsService с использованием API OAuth v2. Я уже загрузил библиотеку Google OAuth2.0, которая, опять же, не имеет надлежащей документации и/или нет подходящих примеров для таких начинающих, как я.

Итак, чтобы подвести итог, есть ли у кого-нибудь какой-либо рабочий пример типа "Hello world" или какое-либо "руководство" для вышеупомянутой проблемы?

В качестве побочной заметки мне удалось получить контакты с помощью API Scribe, но, как вы знаете, ответ находится в формате xml/json, который сначала нужно разобрать, а не то, что я хочу.

Спасибо

Ответ 1

Кажется, я наконец-то добился определенного прогресса. Проблема, по-видимому, заключалась в том, что там есть множество разных библиотек OAuth2, некоторые из них либо устарели, либо просто не будут работать с контактами v3, т.е. Сгенерированный токен доступа будет недействительным (что я и сделал).

Итак, для авторизации и создания токена доступа я использовал API API Google 1.14.1 (бета), а мой код выглядит следующим образом:

Сервлет 1 (создание URL-адреса авторизации):

protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");           

        GoogleAuthorizationCodeRequestUrl authorizationCodeURL=new GoogleAuthorizationCodeRequestUrl(CLIENT_ID, REDIRECT_URL, SCOPES);

        authorizationCodeURL.setAccessType("offline");//For future compatibility

        String authorizationURL=authorizationCodeURL.build();
        System.out.println("AUTHORIZATION URL: "+authorizationURL); 

        response.sendRedirect(new URL(authorizationURL).toString());

}

Сервлет 2 (имеющий доступ к токену доступа)

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();


    out.println("<html>");
    out.println("<head>");
    out.println("<title>Servlet SignInFinished</title>");
    out.println("</head>");
    out.println("<body>");


    HttpTransport transport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();
    GoogleAuthorizationCodeTokenRequest authorizationTokenRequest = new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, request.getParameter("code"), REDIRECT_URL);

    GoogleTokenResponse tokenResponse = authorizationTokenRequest.execute();

    out.println("OAuth2 Access Token: " + tokenResponse.getAccessToken());

    GoogleCredential gc = new GoogleCredential();
    gc.setAccessToken(tokenResponse.getAccessToken());

    ContactsService contactsService = new ContactsService("Lasso Project");
    contactsService.setOAuth2Credentials(gc);

    try {
        URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full");

        Query myQuery = new Query(feedUrl);
        myQuery.setMaxResults(1000);

        ContactFeed resultFeed = contactsService.query(myQuery, ContactFeed.class);

        for (int i = 0; i < resultFeed.getEntries().size(); i++) {
            out.println(resultFeed.getEntries().get(i).getTitle().getPlainText() + "<br/>");
        }

    } catch (Exception e) {
        System.out.println(e);
    }

    out.println("</body>");
    out.println("</html>");
}

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

Хорошо, надеюсь, это будет полезно для некоторых из вас:).

Ответ 2

У меня также были проблемы с поиском контактов Google. С OAuth2.0 вам сначала нужно получить токен доступа. Затем вам станет легче, вы можете запросить идентификатор группы, которую вы ищете:

import com.google.gdata.client.contacts.ContactsService;
import com.google.gdata.data.contacts.ContactEntry;
import com.google.gdata.data.contacts.ContactFeed;
import com.google.gdata.data.contacts.ContactGroupEntry;
import com.google.gdata.data.contacts.ContactGroupFeed;

private static final String GROUPS_URL = "https://www.google.com/m8/feeds/groups/default/full";

private int getIdOfMyGroup() {
    ContactsService contactsService = new ContactsService("MY_PRODUCT_NAME");
    contactsService.setHeader("Authorization", "Bearer " + MY_ACCESS_TOKEN);

    try {
        URL feedUrl = new URL(GROUPS_URL);
        ContactGroupFeed resultFeed = contactsService.getFeed(feedUrl, ContactGroupFeed.class);
        // "My Contacts" group id will always be the first one in the answer
        ContactGroupEntry entry = resultFeed.getEntries().get(0);

        return entry.getId();
    } catch (...) { ... }
}

В конце концов вы сможете с идентификатором группы запросить свои контакты:

private static final String CONTACTS_URL = "https://www.google.com/m8/feeds/contacts/default/full";
private static final int MAX_NB_CONTACTS = 1000;

private List<ContactEntry> getContacts() {
    ContactsService contactsService = new ContactsService("MY_PRODUCT_NAME");
    contactsService.setHeader("Authorization", "Bearer " + MY_ACCESS_TOKEN);

    try {
        URL feedUrl = new URL(CONTACTS_URL);
        Query myQuery = new Query(feedUrl);
                    // to retrieve contacts of the group I found just above
        myQuery.setStringCustomParameter("group", group);
        myQuery.setMaxResults(MAX_NB_CONTACTS);
        ContactFeed resultFeed = contactsService.query(myQuery, ContactFeed.class);
        List<ContactEntry> contactEntries = resultFeed.getEntries();

        return contactEntries;
    } catch (...) { ... }
}