Как получить в автономном режиме маркер и маркер обновления и автоматического обновления доступа к Google API-интерфейс


Я разрабатываю приложение, которое обращается к API Google (начиная с Calendar API), используя OAuth2 и клиентские библиотеки google для этого (находится на Appengine и GWT BTW).

Я реализовал свой OAuth2Call задний сервлет, расширяя Google AbstractAppEngineAuthorizationCodeCallbackServlet.

У меня это работает, я получаю доступ и могу смотреть на календари и т. д., Но есть две проблемы:

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

public static GoogleAuthorizationCodeFlow newFlow( String scope ) throws IOException {
    GoogleAuthorizationCodeFlow.Builder builder = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, 
            JSON_FACTORY,
            getClientSecrets(), 
            Collections.singleton( scope ) );

    builder.setCredentialStore( new AppEngineCredentialStore() ).setAccessType("offline");

    return builder.build();
}

2) я не вижу, как установить автоматический обновить функциональность. Эти страницы описывают методы:

Но я не вижу, куда добавить прослушиватель обновления. В классе GoogleAuthorizationCodeFlow.Builder такого метода нет, в отличие от класса Credential.Builder

Править После отладки кода больше, когда учетные данные возвращаются (в методе onSuccess()), кажется, что у него есть набор RefreshListener already.....so может быть, это их по умолчанию, и мой единственный проблема в том, что я не получаю refresh_token, несмотря на то, что прошу об этом.

Может быть, нужно также просмотреть настройки в консоли Google API?

3 14

3 ответа:

Одна вещь, которую вы должны быть осторожны: маркер обновления возвращается (в дополнение к маркеру доступа)только тогда, когда пользователь дает явное согласие на запрошенные области. В основном, когда отображается страница утверждения. Все последующие потоки будут возвращать только маркер доступа.

Теперь, чтобы протестировать приложение и убедиться, что вы получили маркер обновления в первый раз, вы можете использовать параметр approval_prompt=force (builder.setApprovalPrompt("force")), чтобы убедиться, что страница утверждения отображается в поток и вы получаете явное согласие от пользователя. После того как вы устраните все проблемы и убедитесь, что маркеры обновления хранятся правильно, вы можете удалить этот флаг (по умолчанию auto)

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

Чтобы получить токен обновления, необходимо установить accessType="offline" и approvalPrompt="force".

   GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT,
                JSON_FACTORY, CLIENT_ID, CLIENT_SECRET,  SCOPE).setAccessType("offline").setApprovalPrompt("force").build();

Я изучил это и пришел к выводу, что access_token нужно использовать только один раз. То есть каждый запрос Google - это двухэтапный процесс:

  1. Используйте refresh_token для создания временного access_token
  2. Используйте access_token для одного или нескольких запросов, необходимых для вашей операции.

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

Для более подробного объяснения: http://www.tqis.com/eloquency/googlecalendar.htm