oauth2.0 使用BetaAnalyticsDataClient获取ga4数据时使用外部帐户的PERMISSION_DENIED

hlswsv35  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(168)

我们的服务旨在协助用户检索GA4数据,以计算ROAS。实际处理流程概述如下:
首先,我创建了Google客户端:

$this->googleClient = new Google_Client();
$scopes = [
    Google_Service_Analytics::ANALYTICS_READONLY,
    Google_Service_Oauth2::USERINFO_EMAIL,
];
$this->googleClient->setAuthConfig($googleOAuthFile);
$this->googleClient->setRedirectUri($redirectUri);
$this->googleClient->setScopes($scopes);
$this->googleClient->setAccessType('offline');
$this->googleClient->setApprovalPrompt("force");

$this->googleClient->createAuthUrl(); // Retrieve authorization code

在获得授权码之后,我继续获得令牌:

$token = $this->googleClient->fetchAccessTokenWithAuthCode($code);
// And save the token

允许用户从其有权访问的属性列表中选择属性ID。

$admin = new Google_Service_GoogleAnalyticsAdmin($this->googleClient);
$accounts = $admin->accountSummaries->listAccountSummaries()->accountSummaries;

foreach ($accounts as $account) {
    foreach ($account->propertySummaries as $property) {
        $propertyId = substr($property->property, strrpos($string, '/') + 1);
        $propertyIds[] = $propertyId;
    }
}
// Then let users choice one property from $propertyIds

当我想检索数据时,我使用令牌来访问数据:

$token = $this->refreshTokenIfExpired($token); // Works fine here

$clientAuthFileData = json_decode(file_get_contents($googleOAuthFile), true);
$credentials = [
    'type'          => 'authorized_user',
    'client_id'     => $clientAuthFileData['web']['client_id'],
    'client_secret' => $clientAuthFileData['web']['client_secret'],
    'refresh_token' => $token,
];

// Utilize the Google Analytics Data API (GA4)
$analyticsClient = new BetaAnalyticsDataClient([
    'credentials' => $credentials,
]);

// Encounter failure at this stage
$analyticsClient->runReport([
    'property' => "properties/{$propertyIdGetFromUser}",
    // Other parameters
]);

收到的错误如下:

{
    "message": "User does not have sufficient permissions for this property. To learn more about Property ID, see https://developers.google.com/analytics/devguides/reporting/data/v1/property-id.",
    "code": 7,
    "status": "PERMISSION_DENIED",
    "details": []
}

为了解决这个问题,我尝试了以下方法:
1.此错误发生在生产服务器上,但在本地工作正常。
1.我已经交换了两个googleOAuthFile示例,但问题仍然存在。
1.在生产服务器上,我已经认证了我的应用,发布状态为“生产中”,用户类型设置为“外部”。
是否有任何其他故障排除步骤或解决方案,您会建议?我真诚地感谢你的帮助。

rekjcdws

rekjcdws1#

用户没有此属性的足够权限。
确切地说,意味着对应用程序进行身份验证的用户无权访问您试图在代码中访问的属性。
如果你以www.example.com的身份运行你的应用程序example@myCompanyDomain.net,你显然可以通过你的帐户访问。如果我尝试运行您的应用程序,我无法访问您的帐户,所以像other@gmail.com一样,我无法访问您的私人数据。
为了允许other@gmail.com访问你的谷歌分析数据,你必须进入谷歌分析帐户的管理员部分,并授予other@gmail.com访问权限。

0pizxfdo

0pizxfdo2#

通过使用Google Analytics Data API (GA4)而不是google/analytics-data SDK来解决这个问题。
对于遇到这种情况的任何人,您可以使用以下命令:

use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('POST', [API_URL], [
    'headers' => [
        'Authorization' => 'Bearer ' . [ACCESS_TOKEN],
        'Accept' => 'application/json',
        'Content-Type' => 'application/json',
    ],
    'json' => $data,
]);

$result = json_decode($response->getBody(), true);

相关问题