Google OAUT и обновить путаницу токена / вопросы - PullRequest
0 голосов
/ 05 ноября 2018

Я ожидал, что обновление маркера с истекшим сроком действия произойдет во время процесса аутентификации, а не во время доступа API.

Мне кажется, я понимаю, почему это происходит - авторизация выполняется один раз, но токен доступа может истечь в любое время, поэтому при каждом истечении срока действия токена необходимо предпринимать попытку обновления.

Я хотел бы подтвердить, что это правильная интерпретация происходящего.

Моя первая подсказка была частью документов , в которых говорилось

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

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

google-oauth-client 1.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 по методу:

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();
  }
}

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

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

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

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

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

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

Кто-нибудь может подтвердить, что у меня правильная общая идея?

...