如何无需添加服务账号邮箱即可通过服务账号访问用户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
相关产品推荐
相关产品推荐

