GoogleCredential 令牌刷新如何工作?

How does GoogleCredential token refresh work?

这是我通过构建器自定义的凭据和分析对象:

GoogleCredential credential = new GoogleCredential
        .Builder()
        .setClientSecrets("ClientSecretId", "Secret")
        .setTransport(HTTP_TRANSPORT)
        .setJsonFactory(JSON_FACTORY)
        .addRefreshListener(new CustomClientCredentialRefreshListener("SomeInfo", "AnotherInfo"))
        .build()

        .setAccessToken("accessToken")
        .setRefreshToken("refreshToken")

        .setExpiresInSeconds(3600L)
        .setExpirationTimeMilliseconds(1472659276L); //future date in epoch time

Analytics analytics = new Analytics.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
        .setApplicationName(APPLICATION_NAME)
        .setHttpRequestInitializer(credential)
        .build();

为什么访问令牌会在我调用任何 api 请求时刷新?例如,当我获得帐户时:

Accounts accounts = analytics.management().accounts().list().execute();

我有回应。没关系,没什么问题。

但是访问令牌还没有过期。 long 变量在这里证明了这一点:setExpirationTimeMilliseconds()

但是它仍在刷新并成功地向我的刷新侦听器返回了一个新的访问令牌。为什么?

setExpirationTimeMilliseconds() 有什么用?

我需要检查过期吗?那么我是否仅在 expired==true 的情况下才在凭据中设置刷新令牌?那么,在其他情况下,我只是设置访问令牌而不刷新?

已解决! 问题出在 Credendial 方法 "getExpiresInSeconds()" returns:

(expirationTimeMilliseconds - clock.currentTimeMillis()) / 1000;

我的 expirationTimeMilliseconds 是 1472659276L

currentTimeMillis returns 例如:1472734893827(比我的数字大3位)

  public void intercept(HttpRequest request) throws IOException {
lock.lock();
try {
  Long expiresIn = getExpiresInSeconds();
  // check if token will expire in a minute
  if (accessToken == null || expiresIn != null && expiresIn <= 60) {
    refreshToken();
    if (accessToken == null) {
      // nothing we can do without an access token
      return;
    }
  }
  method.intercept(request, accessToken);
} finally {
  lock.unlock();
}

Token 每次都去刷新因为

if (accessToken == null || expiresIn != null && expiresIn <= 60)

每次都是真的