DCM / DFA сообщает об API и обновляет токены - PullRequest
0 голосов
/ 26 октября 2018

В Google OAuth2 документах

под токенами обновления написано:

При необходимости обновите токен доступа.

Срок действия токенов доступа ограничен.Если вашему приложению требуется доступ к API Google после срока действия одного токена доступа, оно может получить токен обновления.Токен обновления позволяет вашему приложению получать новые токены доступа.

Как узнать, применим ли этот вариант использования к моему приложению?

Я получаю доступ к данным DCM / DFA ине уверены, нужно ли мне беспокоиться об обновлении токена доступа.

РЕДАКТИРОВАТЬ ДЛЯ ПИНОЙИД

Пиноид упоминает об обновлении токена.

В примере приложения DCM этот код (com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp)

public Credential authorize(String userId) throws IOException {
try {
  Credential credential = flow.loadCredential(userId);
  if (credential != null
      && (credential.getRefreshToken() != null || 
          credential.getExpiresInSeconds() == null || 
          credential.getExpiresInSeconds() > 60)) {
    return credential;
  }
  // open in browser
  String redirectUri = receiver.getRedirectUri();

, кажется, говорит, пока выненулевой токен обновления, который вы аутентифицировали.

Я смог заменить свой токен обновления строкой мусора и по-прежнему получать доступ.

Кажется, что-то не так.Есть какой-нибудь способ проверить токен обновления или он не нужен?

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ ДЛЯ pinoyyid:

Я думаю, что получил его.Я хотел бы подтвердить, что это правильное толкование того, что происходит.

Моя первая подсказка была частью документации (https://developers.google.com/identity/protocols/OAuth2WebServer#offline), в которой говорилось

"Если вы используетеВ клиентской библиотеке Google API клиентский объект обновляет маркер доступа по мере необходимости, пока вы настраиваете этот объект для автономного доступа. "

Я использую следующее:

google-oauth-client1.24.1 google-oauth-client-java6 1.24.1 google-oauth-client-jetty 1.24.1

Когда я запускаю с совершенно недействительным токеном доступа («я не годен») и действительным обновлениемтокен и выполнить вызов API DCM для подкласса com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient, я наблюдаю следующее поведение:

управление переходит к com.google.api.client.auth.oauth2.Credential at метод:

  public final boolean refreshToken() throws IOException {
lock.lock();
try {
  try {
    TokenResponse tokenResponse = executeRefreshToken();
    if (tokenResponse != null) {
      setFromTokenResponse(tokenResponse);
      for (CredentialRefreshListener refreshListener : refreshListeners) {
        refreshListener.onTokenResponse(this, tokenResponse);
      }
      return true;
    }
  } catch (TokenResponseException e) {
    boolean statusCode4xx = 400 <= e.getStatusCode() && e.getStatusCode() < 500;
    // check if it is a normal error response
    if (e.getDetails() != null && statusCode4xx) {
      // We were unable to get a new access token (e.g. it may have been revoked), we must now
      // indicate that our current token is invalid.
      setAccessToken(null);
      setExpiresInSeconds(null);
    }
    for (CredentialRefreshListener refreshListener : refreshListeners) {
      refreshListener.onTokenErrorResponse(this, e.getDetails());
    }
    if (statusCode4xx) {
      throw e;
    }
  }
  return false;
} finally {
  lock.unlock();
}

}

это выходит и получает новый токен доступа, пока токен обновления действителен (я пытался использовать недопустимый токен обновленияи смотрел, как он терпит неудачу).

После успехаl получение нового токена доступа, управление переходит к

refreshListener.onTokenErrorResponse(this, e.getDetails());

токен вставляется в соответствующие объекты и доступ продолжается.

Если я запускаю с неверным токеном обновления, вышеуказанный метод завершается неудачнос:

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant",
  "error_description" : "Bad Request"
}
...