Ответ 1
Если токен истек, вы можете вызвать gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse()
. Он возвращает обещание.
Я использую вход в Google. Пользователь приходит на мой сайт и входит в систему с gapi.auth2.getAuthInstance().signIn()
, или они уже вошли в систему, и когда страница загружается (или перезагружается), мы получаем статус. На данный момент у меня есть токен идентичности в течение часа, который я могу проверить на сервере.
Когда пользователь покидает сеанс браузера (скажем, на ночь), этот токен истекает. gapi.auth2.getAuthInstance().isSignedIn.get()
возвращает true, но токен не проверяет.
Как я могу войти в систему и сохранить их во время входа в активную сессию (т.е. браузер не был закрыт)? Или обновить токен? Что-нибудь более изящное, чем перезагрузка страницы...
Изменить: токен обновления не является правильным ответом; Мне не нужен автономный доступ (и вы не хотите запрашивать разрешение). Очевидно, Google полагает, что пользователь по-прежнему подписал мое приложение; пользователь может перезагрузить страницу и получить новый токен без предоставления учетных данных снова. Конечно, есть какой-то механизм более изящный, чем скрытый iframe, чтобы получить обновленный токен?
Если токен истек, вы можете вызвать gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse()
. Он возвращает обещание.
FWIW, нам удалось (в основном) заставить его работать с помощью подхода слушателя. Похоже, что обратный вызов 'userChanged' вызывается ~ за 5 минут до истечения срока действия токена доступа. Это достаточно для того, чтобы мы могли извлечь и обновить токен доступа, не обновляя страницу.
Что не совсем работает, когда компьютер возвращается из сна. Это можно легко решить с помощью перезагрузки страницы при пробуждении.
Вы можете выполнить это с помощью listeners.
var auth2 = gapi.auth2.getAuthInstance();
// Listen for changes to current user.
// (called shortly before expiration)
auth2.currentUser.listen(function(user){
// use new user in your OpenID Connect flow
});
Это позволит вам сохранять текущие учетные данные, пока браузер остается активным.
Если компьютер поставлен в спящий режим, дополнительная работа должна быть выполнена для получения текущих учетных данных.
if (auth2.isSignedIn.get() == true) {
auth2.signIn();
}
Вы можете использовать Обновить токен, чтобы получить доступ в автономный режим. Согласно официальной ссылке
Точки доступа имеют ограниченный срок службы. Если вашему приложению требуется доступ к API Google за пределы срока службы одного токена доступа, он может получить токен обновления. Ток обновления позволяет вашему приложению получать новые токены доступа.
В основном вы получите refresh token
при первом запросе аутентификации. Вам необходимо безопасно сохранить этот токен для будущего использования. access token
(вы упомянули как токен идентификации) истекает через час. После этого вы должны использовать refresh token
каждый раз, когда хотите получить новый используемый access token
.
В зависимости от клиентской библиотеки вы используете синтаксис. Ниже приведен пример библиотеки php client.
// get access token from refresh token if access token expire
if($client->getAuth()->isAccessTokenExpired()) {
$client->refreshToken($securelyPreservedRefreshToken);
$newToken = $client->getAccessToken();
}
проверьте этот для подробных шагов.