Google Analytics 4 API - 服务帐户具有完整的管理员权限 - 仍然拒绝所有 API 调用

问题描述 投票:0回答:1

我有以下 Java 代码来尝试使用 GA4 Java 绑定/类从 GA4 获取单个指标:

String propertyId = "123123123";

GoogleCredentials gc = ServiceAccountCredentials.fromStream(this.getClass().getResourceAsStream("/client_secrets.json"))
                    .createScoped(Collections.singletonList(StorageScopes.DEVSTORAGE_FULL_CONTROL));

            BetaAnalyticsDataSettings betaAnalyticsDataSettings = BetaAnalyticsDataSettings.newBuilder().setCredentialsProvider(FixedCredentialsProvider.create(gc)).build();

            BetaAnalyticsDataClient betaAnalyticsDataClient = BetaAnalyticsDataClient.create(betaAnalyticsDataSettings);

RunReportRequest request = RunReportRequest.newBuilder().setProperty("properties/" + propertyId).
                    addMetrics(Metric.newBuilder().setName("active7DayUsers")).
                    addDateRanges(DateRange.newBuilder().
                            setStartDate("2023-07-31").setEndDate("today")).build();

            RunReportResponse response = betaAnalyticsDataClient.runReport(request);

这会导致 RunReportResponse 生成出现异常,例如。 g.

com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scopes

如何获得足够的认证范围?

到目前为止我已经

  • 确认、再次确认、再次确认我在代码中传递的 PropertID 是针对正确的 GA4 属性。
  • 确认、再确认、再确认,该 PropertyID 所在的 GA4 帐户实际上是我从 GA4 Web 界面下载的 client_secrets.json 隐含的帐户,通过 client_secrets.json 文件中隐含的服务帐户,通过 client_email 字段.
  • 确认、再确认、再确认,我的 client_secrets.json 文件隐含的 GA4 服务帐号实际上是与我在 GA4 网络界面中引用的此帐号和媒体资源关联的 GA4 服务帐号。
  • 确认、再次确认、再确认所引用的账户和所引用的财产 上面的代码在 GA4 Web 界面中具有完整的管理员权限。

有什么想法或指示吗?

我已经完成了我能找到的每个 GUI 选项,我为 GA4 帐户和属性设置了完整的管理员权限,并且使用 GA4 GUI 我可以看到属性在那里,数据正在积累等 - 一切都正常,除了API。

这个问题非常普遍,我已经阅读了几篇有关此问题的帖子,但根本没有解决方案。

我还尝试降级帐户和财产的每个权限,并以所有可能的组合升级它们,继续获得

com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scope

我做错了什么?上面的代码有问题吗?

谢谢

java authentication google-analytics-api runtimeexception
1个回答
1
投票

请检查另一个选项:转到您的analytics.google帐户,然后单击“财产访问管理”或“财产访问管理”(抱歉,我的页面是意大利语,我正在使用浏览器的“翻译成英语”选项以便于理解) )

然后您应该会在此处的 client_secrets.json 文件中看到具有

Administrator
角色的电子邮件。

Java部分:

假设 credentialsJsonPath 变量是

String
以及您的秘密 json 文件的路径,而 propertyId 是包含您的客户端 propertyId 的变量。
... Files.createDirectories(Paths.get(credentialsJsonPath).getParent());

                GoogleCredentials credentials =
                        GoogleCredentials.fromStream(new FileInputStream(credentialsJsonPath));
    
                BetaAnalyticsDataSettings betaAnalyticsDataSettings =
                        BetaAnalyticsDataSettings.newBuilder()
                        .setCredentialsProvider(FixedCredentialsProvider.create(credentials))
                        .build();    
    
                try (BetaAnalyticsDataClient analyticsData =
                        BetaAnalyticsDataClient.create(betaAnalyticsDataSettings)) {
                     
                    int offset=0;
                    int limit=100000;
RunReportRequest request =
                RunReportRequest.newBuilder()
                .setProperty("properties/" + propertyId)
.addDateRanges(DateRange.newBuilder().setStartDate("your start date").setEndDate("your end date"))


                .addDimensions(Dimension.newBuilder().setName("date")) 
                .addDimensions(Dimension.newBuilder().setName("eventName"))

                .addMetrics(Metric.newBuilder().setName("eventCount"))
                .addMetrics(Metric.newBuilder().setName("eventsPerSession"))
                .addMetrics(Metric.newBuilder().setName("eventValue"))
.setOffset(offset)
                .setLimit(limit)
                .build();

    RunReportResponse response = analyticsData.runReport(request);
                System.out.println(response);
 }catch(Exception e){
e.printStackTrace();
}

当然,您可以阅读任何其他兼容的维度/指标,我只是使用了一些示例。

© www.soinside.com 2019 - 2024. All rights reserved.