You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VM中部署的Java应用使用Refresh Token调用Google Analytics数据的认证方案问题(GoogleCredentials已过时)

使用Refresh Token生成Google Analytics认证凭证(替代已弃用的GoogleCredential)

你提到的GoogleCredential被弃用的问题确实很常见,现在Google已经把认证模块迁移到了com.google.auth.oauth2包下的新类,完全可以不用浏览器交互,直接用你已有的Refresh Token生成可访问GA数据的凭证——正好匹配你前端处理认证、后端安全存储Refresh Token的需求。下面是具体的实现方案:

先确认依赖配置

首先要确保你的项目引入了最新的Google Auth库(替代旧的google-api-client),以Maven为例:

<dependency>
    <groupId>com.google.auth</groupId>
    <artifactId>google-auth-library-oauth2-http</artifactId>
    <version>1.20.0</version> <!-- 建议使用Maven中央仓库的最新版本 -->
</dependency>
<!-- 如果是访问GA4数据,引入这个;UA的话换成google-analytics-reporting -->
<dependency>
    <groupId>com.google.analytics.data</groupId>
    <artifactId>google-analytics-data</artifactId>
    <version>0.4.0</version>
</dependency>

替换旧代码:用Refresh Token构建Credentials

下面是完全替代你原有getCredentials()方法的实现,彻底抛弃弃用的GoogleCredential:

import com.google.auth.oauth2.OAuth2Credentials;
import com.google.auth.oauth2.RefreshTokenCredentials;
import com.google.auth.oauth2.ClientId;
import com.google.auth.http.HttpTransportFactory;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import java.io.IOException;
import java.util.Collections;

// 建议把这些常量抽离到独立配置类中
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

public OAuth2Credentials getCredentials() throws IOException {
    // 从安全存储(比如加密数据库、配置中心)加载以下信息,绝对不要硬编码!
    String storedRefreshToken = "<YOUR_SECURELY_STORED_REFRESH_TOKEN>";
    String clientId = "<YOUR_CLIENT_ID>";
    String clientSecret = "<YOUR_CLIENT_SECRET>";
    
    // 构建客户端身份凭证
    ClientId clientCredentials = ClientId.of(clientId, clientSecret);
    
    // 创建RefreshTokenCredentials,它会自动处理token过期刷新
    RefreshTokenCredentials credentials = RefreshTokenCredentials.newBuilder()
            .setClientId(clientCredentials)
            .setRefreshToken(storedRefreshToken)
            // 遵循最小权限原则,只请求需要的权限,不要用all()
            .setScopes(Collections.singletonList("https://www.googleapis.com/auth/analytics.readonly"))
            .setHttpTransportFactory(() -> HTTP_TRANSPORT) // 简化的Lambda写法
            .build();
    
    // 可选:提前触发token刷新(如果需要立即拿到有效token的话)
    credentials.refreshIfExpired();
    
    return credentials;
}

用Credentials访问GA数据

以GA4的Data API为例,你可以这样使用生成的凭证:

import com.google.analytics.data.v1beta.AnalyticsDataClient;
import com.google.analytics.data.v1beta.AnalyticsDataSettings;
import com.google.analytics.data.v1beta.RunReportRequest;
import com.google.analytics.data.v1beta.RunReportResponse;
import java.io.IOException;

public void fetchGa4Data() throws IOException {
    OAuth2Credentials credentials = getCredentials();
    
    // 配置AnalyticsData客户端
    AnalyticsDataSettings clientSettings = AnalyticsDataSettings.newBuilder()
            .setCredentialsProvider(() -> credentials)
            .build();
    
    // 使用try-with-resources确保客户端正确关闭
    try (AnalyticsDataClient analyticsDataClient = AnalyticsDataClient.create(clientSettings)) {
        // 构建你的数据查询请求,这里是示例:按日期获取活跃用户
        RunReportRequest request = RunReportRequest.newBuilder()
                .setProperty("properties/<YOUR_GA4_PROPERTY_ID>")
                .addDimensions(com.google.analytics.data.v1beta.Dimension.newBuilder().setName("date"))
                .addMetrics(com.google.analytics.data.v1beta.Metric.newBuilder().setName("activeUsers"))
                .build();
        
        RunReportResponse response = analyticsDataClient.runReport(request);
        // 处理返回的响应数据
        System.out.println("GA4查询结果:" + response);
    }
}

几个关键注意点

  • 最小权限原则:永远不要请求比实际需要更宽的权限,比如只读GA数据就用analytics.readonly,不要用AnalyticsScopes.all(),这能大幅降低凭证泄露的风险。
  • 自动刷新机制:RefreshTokenCredentials会在token过期时自动刷新,你不需要手动调用刷新逻辑——除非你需要提前获取有效token(比如启动时验证)。
  • 安全存储:Refresh Token、Client ID和Client Secret一定要存在加密的存储中,比如数据库加密字段、专业配置中心等,绝对不能硬编码在代码或明文配置文件里。
  • UA兼容:如果是访问旧的Universal Analytics(UA)数据,只需要把GA4的依赖换成google-analytics-reporting,客户端类换成AnalyticsReporting,认证逻辑完全一致。

内容的提问来源于stack exchange,提问作者Sriram R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:12:43