使用OAuth 2.0 Google App Engine刷新访问令牌

Aer*_*rox 5 java google-app-engine oauth oauth-2.0 google-oauth

我想实现自动刷新方法以获得新的访问令牌,因为已经从第一个授权流中获取了刷新令牌.

我应该调用哪种方法或方法列表?我正在使用Java和OAuth 2.0进行Web应用程序.鉴于OAuth 2.0 WebApplication,我应该在此代码中添加什么才能使一切正常工作?

Owe*_*Cao 7

您在问题中提供的链接通过使用Google API Client Library for Java实现了Google OAuth 2.0授权.并且该库实现了刷新访问令牌的功能.

所以你需要的是在这个库中使用Class GoogleRefreshTokenRequest.

此类是特定于Google的OAuth 2.0请求实现,用于使用刷新访问令牌中指定的刷新令牌刷新访问令牌.

它的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());
  }
}
Run Code Online (Sandbox Code Playgroud)

}

这是您可以参考的另一种用法.

您可以在CredentialManager.java中添加以下代码,当您需要刷新令牌时,请调用此方法.

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用DataStoreCredentialRefreshListener

使用GoogleCredential访问受保护的资源.过期的访问令牌将使用刷新令牌自动刷新(如果适用).确保使用DataStoreCredentialRefreshListener并使用GoogleCredential.Builder.addRefreshListener(CredentialRefreshListener)为凭证设置它.