以下是我通过构建器定制的凭据和分析对象:
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
的情况下在凭据中设置刷新令牌?然后,在其他情况下,我只是设置访问令牌没有刷新?
解决!问题是在凭据方法"getExpiresInSeconds()"返回:
(expirationTimeMilliseconds - clock.currentTimeMillis()) / 1000;
我的expirationtimemillisseconds是1472659276L
currentTimeMillis返回例如: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)
每次