Получение нулевого токена обновления
Я использую версию google-api-java-client версии 1.8 beta для аутентификации oAuth2 с учетными записями Google. Все нормально, пока я не получаю объект GoogleTokenResponse, у которого есть токен доступа, но не обновляется токен.
Чтобы создать URL-адрес запроса, выполните следующие действия:
...
googleAuthenticationUrl = new GoogleAuthorizationCodeRequestUrl(CLIENT_ID, callBackUrl, scopes).build();
...
При получении токена запроса я обмениваю его с токеном доступа в этой строке:
...
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, request.getParameter(CODE_URL_PARAM), callBackUrl).execute();
...
Возвращенный объект GoogleTokenResponse не содержит токен обновления:
{"access_token":"ya29.AH..etc...9-Y","expires_in":3600,"token_type":"Bearer"}
Не могли бы вы пролить свет на этот вопрос? Большое вам спасибо за помощь!
Ответы
Ответ 1
При создании запроса Url вы должны установить Тип доступа:
requestUrl = new GoogleAuthorizationCodeRequestUrl(googleClientId, callBackUrl, scopes).setAccessType("offline").build();
Как описано в этой странице, этот параметр рекомендуется:
[...] Мы рекомендуем вам явно установить параметр access_type в автономном режиме, потому что мы ожидаем, что когда онлайн-значение введенный, это будет по умолчанию. Это может вызвать неожиданные изменения в вашем приложении, поскольку это повлияет на способ что вашему приложению разрешено обновлять токены доступа. От явно устанавливая значение параметра в автономном режиме, вы можете избежать изменения в функциональности вашего приложения. [...]
Ответ 2
В дополнение к ответу PapelPincel я должен был также заставить приглашение на утверждение использовать .Net
релиз 1.8.1.970, чтобы получить токен обновления. например,
var authReq = new GoogleAuthorizationCodeRequestUrl(new Uri(GoogleAuthConsts.AuthorizationUrl)) {
RedirectUri = Callback,
ClientId = ClientId,
AccessType = "offline",
Scope = string.Join(" ", new[] { Scopes... }),
ApprovalPrompt = "force"
};
Ответ 3
Для всех, кто попал сюда из поиска Google, я не использовал поток чистой серверной стороны, поэтому получал токен авторизации через javascript, как в этом doc, @PapelPincel ответ был для меня намеком.
Вам следует добавить data-accesstype = "offline" , как в следующем фрагменте:
Пример:
<span
data-accesstype="offline"
class="g-signin"
data-callback="signinCallback"
data-clientid="CLIENT_ID"
data-redirecturi="postmessage"
data-cookiepolicy="single_host_origin"
data-requestvisibleactions="http://schemas.google.com/AddActivity"
data-scope="https://www.googleapis.com/auth/plus.login">
</span>