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

Я использую google-api-java-client версии 1.8-бета для аутентификации 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"}

Не могли бы вы пролить мой свет на этот вопрос? Спасибо большое за помощь!


person PapelPincel    schedule 24.04.2012    source источник


Ответы (3)


При создании URL-адреса запроса вы должны установить тип доступа:

requestUrl = new GoogleAuthorizationCodeRequestUrl(googleClientId, callBackUrl, scopes)
    .setApprovalPrompt("force") // needed if user already granted permission
    .setAccessType("offline")
    .build();

Как описано на этой странице, рекомендуется установить этот параметр:

[...] Мы рекомендуем вам явно установить для параметра access_type значение offline, потому что мы ожидаем, что когда будет введено онлайн-значение, оно будет поведением по умолчанию. Это может привести к неожиданным изменениям в вашем приложении, поскольку это повлияет на то, как ваше приложение может обновлять токены доступа. Явным образом установив для параметра значение offline, вы сможете избежать каких-либо изменений в функциональности вашего приложения. [...]

person PapelPincel    schedule 25.04.2012
comment
в GoogleAuthorizationCodeFlow.Builder : предупреждение об обновлении: до версии 1.10 по умолчанию было {@code offline}. Однако, начиная с версии 1.10, это {@code null}, что означает {@code online} для веб-приложений. Чтобы сохранить предыдущее поведение, вам нужно явно вызвать {@code setAccessType(offline)}. - person koma; 19.08.2012
comment
Если то, что вы (PapelPincel) пишете (взято со страницы Google Developer), было правильным, я бы сказал, что этого недостаточно для автоматического обновления токена до истечения срока его действия (как developers.google.com/oauthplayground. Итак, как мне обновить токен доступа в фоновом режиме, не спрашивая пользователя в другой раз о новой авторизации? - person Aerox; 10.06.2014

В дополнение к ответу 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" 
}; 
person Micah    schedule 20.03.2014

Для тех, кто попал сюда из поиска 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>
person redochka    schedule 26.04.2014