Как получить токен токена и обновить токен и автоматически обновить доступ к 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