Как получить в автономном режиме маркер и маркер обновления и автоматического обновления доступа к 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 ответа:
Одна вещь, которую вы должны быть осторожны: маркер обновления возвращается (в дополнение к маркеру доступа)только тогда, когда пользователь дает явное согласие на запрошенные области. В основном, когда отображается страница утверждения. Все последующие потоки будут возвращать только маркер доступа.
Теперь, чтобы протестировать приложение и убедиться, что вы получили маркер обновления в первый раз, вы можете использовать параметр 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 - это двухэтапный процесс:
- Используйте refresh_token для создания временного access_token
- Используйте access_token для одного или нескольких запросов, необходимых для вашей операции.
Я видел здесь пару сообщений о том, что часы сервера синхронизированы. Но это кажется излишней сложностью.
Для более подробного объяснения: http://www.tqis.com/eloquency/googlecalendar.htm