Получение нулевого токена обновления

Я использую версию 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>