我曾希望在身份验证过程中而不是在api访问期间刷新过期的访问令牌。
我想我理解为什么会发生这种情况-授权只执行一次,但是访问令牌可以随时过期,因此,只要确定令牌已过期,就需要尝试刷新。
我想确认这是对正在发生的事情的正确解释。
我的第一个线索是docs中所说的部分
如果您使用Google API客户端库,则客户端对象会刷新 只要您为该对象配置访问令牌,就可以根据需要访问令牌 离线访问。
我正在使用以下内容:
google-oauth-client 1.24.1
google-oauth-client-java6 1.24.1
google-oauth-client-jetty 1.24.1
当我使用完全无效的访问令牌(“我不好”)和有效的刷新令牌运行时,执行
DCM API对com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient
子类的调用,我观察到以下行为:
控制权通过方法:
传递给com.google.api.client.auth.oauth2.Credentialpublic 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" }
任何人都可以确认我有正确的一般想法吗?