Как получить токен токена и обновить токен и автоматически обновить доступ к API Google

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

Я выполнил мой OAuth2Call back servlet, расширив 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 уже установлен..... так что, возможно, это по умолчанию, и моя единственная проблема - я не получив refresh_token, несмотря на просьбу об этом.

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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