Существует два типа аккаунтов Google Рекламы: управляющие аккаунты Google Рекламы и аккаунты рекламодателей Google Рекламы (также известные как клиентские аккаунты). Управляющие аккаунты могут управлять другими управляющими аккаунтами Google Рекламы или аккаунтами рекламодателей Google Рекламы. Вы можете связать аккаунт рекламодателя с управляющим аккаунтом и затем управлять им через управляющий аккаунт. Общая связанная структура представляет собой направленный ациклический граф с аккаунтами рекламодателей на уровне конечных элементов.
Вы можете предоставить отдельным пользователям или сервисным аккаунтам доступ к аккаунтам Google Рекламы. Существует два способа предоставить пользователям доступ к аккаунту рекламодателя:
- Предоставьте пользователю прямой доступ к аккаунту рекламодателя, пригласив его в этот аккаунт.
- Предоставьте пользователю косвенный доступ к аккаунту рекламодателя, пригласив его в аккаунт менеджера , связанный с этим аккаунтом. Пользователь получает доступ к аккаунту рекламодателя, поскольку аккаунт менеджера имеет доступ ко всем связанным с ним аккаунтам.
Вы также можете назначать роли пользователям , когда приглашаете пользователя управлять учетной записью.
Рассмотрим следующую иерархию учётных записей. Предположим, что все пользователи имеют стандартный доступ.
В следующей таблице представлена краткая информация о структуре счета.
Пользователь | Имеет прямой доступ к | Имеет косвенный доступ к |
---|---|---|
У1, СА1 | М1 | М2, А1, А2, А3 |
U2 | М2, М3 | А1, А2, А3, А4 |
У3 | А4 |
Идентификатор клиента для входа
Пользователь может иметь доступ к нескольким иерархиям учётных записей. В таких случаях при выполнении вызова API необходимо указать учётную запись root, которая будет использоваться для корректного определения уровней авторизации и доступа к учётной записи. Это достигается путём указания заголовка login-customer-id
в составе запроса API.
В следующей таблице используется иерархия учетных записей из предыдущего примера , чтобы показать, какие идентификаторы клиентов для входа вы можете использовать, а также соответствующий список учетных записей, на которые вы можете совершать звонки.
Пользователь | Войдите в систему, чтобы использовать идентификатор клиента. | Учетные записи для выполнения вызовов API |
---|---|---|
У1, СА1 | М1 | М1, М2, А1, А2, А3 |
U2 | М2 | М2, А1, А2, А3 |
U2 | М3 | М3, А1, А4 |
У3 | А4 | А4 |
Вы можете не указывать заголовок login-customer-id
если у пользователя есть прямой доступ к аккаунту Google Ads, к которому вы совершаете вызовы. Например, вам не нужно указывать заголовок login-customer-id
при использовании учётных данных U3
для вызова A4
, поскольку серверы Google Ads могут правильно определить уровень доступа по идентификатору клиента ( A4
).
Если вы используете одну из наших клиентских библиотек, то используйте следующие настройки для указания заголовка login-customer-id
.
Ява
Добавьте следующий параметр в файл ads.properties
.
api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE
С#
Добавьте следующий параметр при инициализации объекта GoogleAdsConfig
и используйте его для создания объекта GoogleAdsClient
.
GoogleAdsConfig config = new GoogleAdsConfig()
{
...
LoginCustomerId = ******
};
GoogleAdsClient client = new GoogleAdsClient(config);
PHP
Добавьте следующий параметр в файл google_ads_php.ini
.
[GOOGLE_ADS]
loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"
Питон
Добавьте следующий параметр в файл google-ads.yaml
.
login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE
Руби
Добавьте следующий параметр в файл google_ads_config.rb
.
Google::Ads::GoogleAds::Config.new do |c|
c.login_customer_id = 'INSERT_LOGIN_CUSTOMER_ID_HERE'
end
Создайте экземпляр GoogleAdsClient
, указав путь к месту хранения этого файла.
client = Google::Ads::GoogleAds::GoogleAdsClient.new('path/to/google_ads_config.rb')
Перл
Добавьте следующий параметр в файл googleads.properties
.
loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE
завиток
При запуске команды curl
укажите следующий аргумент командной строки.
-H "login-customer-id: LOGIN_CUSTOMER_ID"
Метод CustomerService.ListAccessibleCustomers
позволяет получить список учётных записей, к которым у пользователя есть прямой доступ. Эти учётные записи можно использовать в качестве допустимых значений заголовка login-customer-id
.
Ява
private void runExample(GoogleAdsClient client) { // Optional: Change credentials to use a different refresh token, to retrieve customers // available for a specific user. // // UserCredentials credentials = // UserCredentials.newBuilder() // .setClientId("INSERT_OAUTH_CLIENT_ID") // .setClientSecret("INSERT_OAUTH_CLIENT_SECRET") // .setRefreshToken("INSERT_REFRESH_TOKEN") // .build(); // // client = client.toBuilder().setCredentials(credentials).build(); try (CustomerServiceClient customerService = client.getLatestVersion().createCustomerServiceClient()) { ListAccessibleCustomersResponse response = customerService.listAccessibleCustomers( ListAccessibleCustomersRequest.newBuilder().build()); System.out.printf("Total results: %d%n", response.getResourceNamesCount()); for (String customerResourceName : response.getResourceNamesList()) { System.out.printf("Customer resource name: %s%n", customerResourceName); } } }
С#
public void Run(GoogleAdsClient client) { // Get the CustomerService. CustomerServiceClient customerService = client.GetService(Services.V21.CustomerService); try { // Retrieve the list of customer resources. string[] customerResourceNames = customerService.ListAccessibleCustomers(); // Display the result. foreach (string customerResourceName in customerResourceNames) { Console.WriteLine( $"Found customer with resource name = '{customerResourceName}'."); } } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); throw; } }
PHP
public static function runExample(GoogleAdsClient $googleAdsClient) { $customerServiceClient = $googleAdsClient->getCustomerServiceClient(); // Issues a request for listing all accessible customers. $accessibleCustomers = $customerServiceClient->listAccessibleCustomers(new ListAccessibleCustomersRequest()); print 'Total results: ' . count($accessibleCustomers->getResourceNames()) . PHP_EOL; // Iterates over all accessible customers' resource names and prints them. foreach ($accessibleCustomers->getResourceNames() as $resourceName) { /** @var string $resourceName */ printf("Customer resource name: '%s'%s", $resourceName, PHP_EOL); } }
Питон
def main(client: GoogleAdsClient) -> None: customer_service: CustomerServiceClient = client.get_service( "CustomerService" ) accessible_customers: ListAccessibleCustomersResponse = ( customer_service.list_accessible_customers() ) result_total: int = len(accessible_customers.resource_names) print(f"Total results: {result_total}") resource_names: List[str] = accessible_customers.resource_names for resource_name in resource_names: # resource_name is implicitly str print(f'Customer resource name: "{resource_name}"')
Руби
def list_accessible_customers() # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new accessible_customers = client.service.customer.list_accessible_customers().resource_names accessible_customers.each do |resource_name| puts "Customer resource name: #{resource_name}" end end
Перл
sub list_accessible_customers { my ($api_client) = @_; my $list_accessible_customers_response = $api_client->CustomerService()->list_accessible_customers(); printf "Total results: %d.\n", scalar @{$list_accessible_customers_response->{resourceNames}}; foreach my $resource_name (@{$list_accessible_customers_response->{resourceNames}}) { printf "Customer resource name: '%s'.\n", $resource_name; } return 1; }
завиток
# Returns the resource names of customers directly accessible by the user # authenticating the call. # # Variables: # API_VERSION, # DEVELOPER_TOKEN, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # curl -f --request GET \ "https://googleads.googleapis.com/v${API_VERSION}/customers:listAccessibleCustomers" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
Роли пользователей
API Google Ads не имеет собственной отдельной модели доступа и не использует отдельные области действия OAuth 2.0 для ограничения функциональности. Например, API Google Ads использует одни и те же области действия для операций «только чтение» и «чтение-запись». Вместо этого API Google Ads использует те же роли пользователей , что и Google Ads. Когда роль пользователя назначается аккаунту на уровне менеджера, она наследуется аккаунтами в иерархии. Если у пользователя есть конфликтующие роли в данном аккаунте, правильный уровень определяется по login-customer-id
указанному в запросе API.
В следующей таблице используется иерархия учетных записей из предыдущего примера и показан эффект предоставления пользователям различных ролей.
Пользователь | Роль пользователя предоставлена | логин-идентификатор-клиента | Эффективный уровень доступа |
---|---|---|---|
СА1 | Стандартный доступ по счету М1 | М1 | Стандартный доступ на M1, M2, A1, A2, A3 |
U2 | Стандартный доступ по М2 Доступ только для чтения на M3 | М2 | Стандартный доступ на M2, A1, A2, A3 |
U2 | Стандартный доступ по М2 Доступ только для чтения на M3 | М3 | Доступ только для чтения к M3, A1, A4 |