尝试将网络媒体资源与 AdWords (Google Ads) 帐户相关联时权限不足 (403)

Posted

技术标签:

【中文标题】尝试将网络媒体资源与 AdWords (Google Ads) 帐户相关联时权限不足 (403)【英文标题】:InsufficientPermission (403) when trying to link Web Property to AdWords (Google Ads) account 【发布时间】:2019-02-08 15:55:15 【问题描述】:

我试图为使用 Analytics Management API 时似乎相对常见的问题寻找解决方案,但遗憾的是没有任何答案有用。

我开始使用具有对我的 Analytics 帐户完全访问权限的服务帐户的 Analytics Management API。它在帐户级别被授予编辑、协作、读取和分析以及管理用户权限,这意味着它们也在属性级别和视图级别被继承。

我可以成功获取我有权访问的帐户,并插入新的网络资源。

但是,我无法将我的 Google Ads 帐户与任何网络媒体资源相关联。每当我调用 API 时都会收到 403 错误:

"error":"errors":["domain":"global","reason":"insufficientPermissions","message":"User does not have sufficient permissions for this web property."],"code":403,"message":"User does not have sufficient permissions for this web property."

我检查了很多次,对于每个级别(帐户、属性甚至视图)我的服务帐户具有哪些权限,总是有编辑、协作、阅读和分析以及管理用户。

以下是我尝试关联 Google Ads 帐户的方法:

<?php
require_once __DIR__ . '/vendor/autoload.php';
$KEY_FILE_LOCATION = __DIR__ . '/service-account-credentials.json';
$client = new Google_Client();
$client->setApplicationName("Hello Analytics Management API");
$client->setAuthConfig($KEY_FILE_LOCATION);
$client->setScopes([
  'https://www.googleapis.com/auth/plus.login',
  'https://www.googleapis.com/auth/analytics',
  'https://www.googleapis.com/auth/analytics.edit',
  'https://www.googleapis.com/auth/analytics.provision',
  'https://www.googleapis.com/auth/analytics.manage.users',
  'https://www.googleapis.com/auth/analytics.readonly'
]);
$analytics = new Google_Service_Analytics($client);
$adWordsAccount = new Google_Service_Analytics_AdWordsAccount();
$adWordsAccount->setCustomerId("XXX-XXX-XXXX");
$adWordsLink = new Google_Service_Analytics_EntityAdWordsLink();
$adWordsLink->setName("TestLink");
$adWordsLink->setAdWordsAccounts([$adWordsAccount]);
try 
  $analytics->management_webPropertyAdWordsLinks->insert(
    999999999, // Analytics Account ID
    "UA-999999999-1", // Tracking ID
    $adWordsLink
  );
 catch (apiServiceException $e) 
  print 'There was an Analytics API service error '
        . $e->getCode() . ':' . $e->getMessage();

 catch (apiException $e) 
  print 'There was a general API error '
      . $e->getCode() . ':' . $e->getMessage();

我知道我使用的范围肯定比我需要的多,但只使用 https://www.googleapis.com/auth/analytics.edit 会得到相同的结果。

下面是我使用的service-account-credentials.json(使用我通过 Google API 控制台生成的密钥):


  "type": "service_account",
  "project_id": "...-230314",
  "private_key_id": "<PRIVATE_KEY_ID>",
  "private_key": "<PRIVATE_KEY>",
  "client_email": "dev-...@ga-....iam.gserviceaccount.com",
  "client_id": "<CLIENT_ID>",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/dev-...%40...-230314.iam.gserviceaccount.com"

提前感谢您的支持!

多里安

【问题讨论】:

【参考方案1】:

为了能够将 Google Analytics(分析)和 Google Ads 关联起来,执行关联的帐户必须是 Google Analytics(分析)网络媒体资源中的编辑(显然您已经这样做了),但还需要是 Google Ads 帐户中的管理员.

不是您的个人/公司 Google 帐户,而是服务帐户本身。您在凭据中包含在 client_email 属性中的电子邮件。

参考:Google Help Center

警告:

我不能 100% 确定您是否能够做到这一点。 Google Ads 可能需要用户确认才能添加到帐户中,而您无权访问服务帐户的邮箱这一事实可能会阻止您执行该确认。 同样我不确定这一点,所以我会尝试,但如果您无法将该用户添加到 Google Ads 帐户,您将不得不找到另一种方法来使用您自己的电子邮件而不是服务帐户。

【讨论】:

您好爱德华多,谢谢您的回答。我已经尝试将我的服务帐户添加为我的 AdWords 帐户的管理员。但正如您所说,我们无法收到邀请,因为无法访问服务帐户电子邮件地址。我正在考虑使用我的服务器应用程序通过刷新令牌使用的用户帐户(就像 AdWords API 一样),但我认为这不是正确的方法。有什么想法吗? 我认为正确的方法是使用 oAuth。您应该能够批准一次并使用刷新键让它在以后运行而无需手动干预。 More info

以上是关于尝试将网络媒体资源与 AdWords (Google Ads) 帐户相关联时权限不足 (403)的主要内容,如果未能解决你的问题,请参考以下文章

如何将资源文件夹中的路径与 Windows 媒体播放器一起使用

使用 Node 获取刷新令牌 - AdWords

google adwords api 与 google-adwords-api gem

网络基础 01_OSI网际互联

如何通过 ClearScript 将 AdWords 公开给 JavaScript?

如何将 OAuth 与 Google AdWords / AdSense API 一起使用?