Я ожидал, что обновление маркера с истекшим сроком действия произойдет во время процесса аутентификации, а не во время доступа 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"
}
Кто-нибудь может подтвердить, что у меня правильная общая идея?