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

如何无需添加服务账号邮箱即可通过服务账号访问用户GA4数据

问题描述

我有一个Laravel项目,尝试获取用户的Google Analytics(GA4)数据。已完成OAuth2认证以获取用户凭证,同时配置了Google Cloud项目,创建了服务账号并正确将服务账号凭证文件添加到项目中(通过.env文件中的GOOGLE_APPLICATION_CREDENTIALS指定文件路径)。

用于获取活跃用户和新用户数据的代码如下:

use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Metric;
use Google\Analytics\Data\V1beta\Dimension;
use Illuminate\Support\Facades\Log;

public function getUserCounts(array $params): array
{
    // Extract validated parameters.
    $propertyId = $params['property_id'];
    $startDate = $params['start_date'];
    $endDate = $params['end_date'];
    $dimension = strtolower($params['dimension']);
    $dimensionName = $dimension === 'weekly' ? 'week' : 'date';

    try {
        // Initialize the BetaAnalyticsDataClient with the acquired access token.
        $analyticsDataClient = new BetaAnalyticsDataClient();

        // Set up the DateRange object.
        $dateRange = new DateRange();
        $dateRange->setStartDate($startDate);
        $dateRange->setEndDate($endDate);

        // Set up the Metric objects.
        $usersMetric = new Metric();
        $usersMetric->setName('activeUsers');

        $newUsersMetric = new Metric();
        $newUsersMetric->setName('newUsers');

        // Set up the Dimension object.
        $dimension = new Dimension();
        $dimension->setName($dimensionName);

        // Build the request data.
        $requestData = [
            'property' => $propertyId, // Must include the "properties/" prefix.
            'dateRanges' => [$dateRange],
            'metrics' => [$usersMetric, $newUsersMetric],
            'dimensions' => [$dimension],
        ];

        // Execute the report request.
        $response = $analyticsDataClient->runReport($requestData);

        // Process and return the response rows.
        $result = [];
        foreach ($response->getRows() as $row) {
            $result[] = [
                $dimension => $row->getDimensionValues()[0]->getValue(),
                'users' => $row->getMetricValues()[0]->getValue(),
                'newUsers' => $row->getMetricValues()[1]->getValue(),
            ];
        }

        return $result;
    } catch (\Exception $e) {
        Log::error('Error fetching GA4 user counts', ['error' => $e->getMessage()]);
        return [
            'error' => true,
            'message' => 'Unable to fetch user counts from GA4',
        ];
    }
}

目前遇到的问题:只有当用户将我的服务账号邮箱添加到其Google Analytics用户列表中时,该方法才能正常运行,否则会返回以下错误:

User does not have sufficient permissions for this property.

我不希望用户手动将邮箱添加到其Analytics控制台中,请问是否有其他获取权限的方式?比如使用OAuth2获取的用户access_token等。

解决方案

你已经完成了OAuth2认证获取用户凭证,完全可以利用OAuth2的access_token替代服务账号方式访问用户GA4数据,无需用户手动操作Analytics控制台。具体调整步骤如下:

1. 确认OAuth2授权范围

引导用户授权时,必须请求GA4只读访问权限,添加以下范围:

  • https://www.googleapis.com/auth/analytics.readonly

2. 修改客户端初始化逻辑

不要使用服务账号的默认初始化方式,而是将OAuth2获取到的用户access_token传入客户端配置:

// 假设已通过OAuth2流程获取到用户的access_token并存储在$accessToken变量中
$analyticsDataClient = new BetaAnalyticsDataClient([
    'credentials' => [
        'access_token' => $accessToken,
    ],
]);

3. 权限验证逻辑说明

用户完成OAuth2授权后,你的应用将以该用户身份访问其有权限的GA4属性,调用runReport接口时会自动使用用户的权限,无需用户在控制台手动添加任何账号。

核心区别

  • 服务账号方式适合访问自身控制的GA4属性,或用户愿意手动授权服务账号的批量场景;
  • OAuth2用户授权方式更适合访问任意用户的GA4属性,且能避免用户手动操作控制台的繁琐步骤;
  • 注意维护access_token的有效性:access_token有过期时间,需配合refresh_token定期刷新,确保持续访问权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:14:53