您在问题中提供的链接使用Google APIs Client Library for Java 实现了 Google OAuth 2.0 授权。和
这个库已经实现了刷新访问令牌的功能。
所以你需要在这个库中使用Class GoogleRefreshTokenRequest。
此类是 OAuth 2.0 请求的 Google 特定实现,用于使用 Refreshing an Access Token 中指定的刷新令牌刷新访问令牌。
而且它的java doc也给出了一个示例用法:
static void refreshAccessToken() throws IOException {
try {
TokenResponse response =
new GoogleRefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(),
"tGzv3JOkF0XG5Qx2TlKWIA", "s6BhdRkqt3", "7Fjfp0ZBr1KtDRbnfVdmIw").execute();
System.out.println("Access token: " + response.getAccessToken());
} catch (TokenResponseException e) {
if (e.getDetails() != null) {
System.err.println("Error: " + e.getDetails().getError());
if (e.getDetails().getErrorDescription() != null) {
System.err.println(e.getDetails().getErrorDescription());
}
if (e.getDetails().getErrorUri() != null) {
System.err.println(e.getDetails().getErrorUri());
}
} else {
System.err.println(e.getMessage());
}
}
}
这是another usage,你可以参考。
您可以在CredentialManager.java中添加如下代码,当需要刷新token时,调用该方法。
public Credential refreshAccessToken(String refreshToken, String clientId, String clientSecret) throws IOException {
try {
TokenResponse response =
new GoogleRefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(),
refreshToken, clientId, clientSecret).execute();
System.out.println("Access token: " + response.getAccessToken());
return buildEmpty().setAccessToken(response.getAccessToken());
} catch (TokenResponseException e) {
if (e.getDetails() != null) {
System.err.println("Error: " + e.getDetails().getError());
if (e.getDetails().getErrorDescription() != null) {
System.err.println(e.getDetails().getErrorDescription());
}
if (e.getDetails().getErrorUri() != null) {
System.err.println(e.getDetails().getErrorUri());
}
} else {
System.err.println(e.getMessage());
}
}
另一种方法是使用 DataStoreCredentialRefreshListener
使用 GoogleCredential 访问受保护的资源。过期的访问令牌将使用刷新令牌(如果适用)自动刷新。确保使用DataStoreCredentialRefreshListener 并使用GoogleCredential.Builder.addRefreshListener(CredentialRefreshListener) 将其设置为凭据。