您还可以通过创建配置为 OAuth 2.0 客户端 ID 的刷新令牌来执行此操作。
转到https://console.developers.google.com/apis/credentials
- 单击“创建凭据”。
- 单击“OAuth 客户端 ID”。
- 选择“Web 应用程序”> 命名。
- 将https://developers.google.com/oauthplayground添加到“授权重定向 URI”。
- 单击创建。
您将需要 ClientId 和 Secret 进行后续步骤。
然后去https://developers.google.com/oauthplayground/
- 单击右上角的“AOuth 2.0 配置”。
- 选中“使用您自己的 OAuth 凭据”。
- 使用上面创建的 OAuth 2.0 凭据的客户端 ID 和密码更新“OAuth 客户端 ID”和“OAuth 客户端密码”。
- 在左上角的第 1 步中,选择所有必要的范围。(请注意,请求中不匹配的范围将返回 'invalid_scopes'。)
- 单击“授权 API”。这会将您重定向到同意页面以允许权限。
- 在第 2 步中,单击“交换令牌授权码”
- 您将获得一个带有刷新令牌的访问令牌。我们将需要此刷新令牌进行下一步。
您可以使用此访问令牌对您在范围中指定的服务进行身份验证。访问令牌是短暂的,刷新令牌会在 24 小时后过期,除非它没有绑定到 OAuth 2.0 客户端(我们只是让我们的刷新令牌持续到它被用户撤销或由于 6 个月不活动而过期)。
您需要在访问令牌过期之前刷新它。查看以下示例以了解如何操作。
public String getNewToken(String refreshToken, String clientId, String clientSecret) throws IOException {
ArrayList<String> scopes = new ArrayList<>();
scopes.add(CalendarScopes.CALENDAR);
TokenResponse tokenResponse = new GoogleRefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(),
refreshToken, clientId, clientSecret).setScopes(scopes).setGrantType("refresh_token").execute();
return tokenResponse.getAccessToken();
}
上面示例中的 clientId 和 clientSecret 指的是 OAuth 2.0 客户端凭据。
您可以像这样创建“GoogleCredential”
public Credential getCredentials() throws GeneralSecurityException, IOException, FileNotFoundException {
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
// Load client secrets.
String CREDENTIALS_FILE_PATH = "/credentials.json"; //OAuth 2.0 clinet credentials json
InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
if (in == null) {
throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
String clientId = clientSecrets.getDetails().getClientId();
String clientSecret = clientSecrets.getDetails().getClientSecret();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setClientSecrets(clientId, clientSecret)
.build();
String refreshToken = "<REFRESH-TOKEN>"; //Find a secure way to store and load refresh token
credential.setAccessToken(getNewToken(refreshToken, clientId, clientSecret));
credential.setRefreshToken(refreshToken);
return credential;
}