Google Ads-Zugriffsmodell

Es gibt zwei Arten von Google Ads-Konten: Google Ads-Verwaltungskonten und Google Ads-Werbekonten. Eine ausführliche Erläuterung dazu, wie diese und andere Begriffe (z. B. Kundenkonto und Kunde) zusammenhängen, finden Sie unter Kontotypen.

Mit Verwaltungskonten können andere Google Ads-Verwaltungskonten oder Google Ads-Werbekonten verwaltet werden. Sie können ein Werbetreibendenkonto mit einem Verwaltungskonto verknüpfen und es dann über das Verwaltungskonto verwalten. Die gesamte verknüpfte Struktur ist ein gerichteter azyklischer Graph mit Werbetreibendenkonten auf der Blattebene.

Sie können einzelnen Nutzern oder Dienstkonten Zugriff auf Google Ads-Konten gewähren. Es gibt zwei Möglichkeiten, Nutzern Zugriff auf ein Werbetreibendenkonto zu gewähren:

  • Gewähren Sie dem Nutzer direkten Zugriff auf das Werbekonto, indem Sie ihn zu diesem Konto einladen.
  • Gewähren Sie dem Nutzer indirekten Zugriff auf das Werbetreibendenkonto, indem Sie ihn in ein Verwaltungskonto einladen, das mit diesem Konto verknüpft ist. Der Nutzer erhält Zugriff auf das Werbetreibendenkonto, da das Verwaltungskonto Zugriff auf alle damit verknüpften Konten hat.

Sie können auch Nutzerrollen zuweisen, wenn Sie einen Nutzer einladen, ein Konto zu verwalten.

Sehen Sie sich die folgende Kontohierarchie an. Angenommen, alle Nutzer haben Standardzugriff.

Diagramm mit den Verwaltungskonten M1, M2 und M3, die mit den Werbetreibendenkonten A1 bis A4 verknüpft sind.

Die folgende Tabelle fasst diese Kontostruktur zusammen.

Nutzer Hat direkten Zugriff auf Hat indirekten Zugriff auf
U1, SA1 M1 M2, A1, A2, A3
U2 M2, M3 A1, A2, A3, A4
U3 A4  

Kundennummer für die Anmeldung

Ein Nutzer kann Zugriff auf mehrere Kontohierarchien haben. Wenn Sie in solchen Fällen einen API-Aufruf ausführen, müssen Sie das zu verwendende Stammkonto angeben, um die Autorisierungs- und Konto-Zugriffsebenen richtig zu bestimmen. Fügen Sie dazu den Header login-customer-id in Ihre API-Anfrage ein.

In der folgenden Tabelle wird die Kontohierarchie aus dem vorherigen Beispiel verwendet, um zu zeigen, welche Kunden-IDs für die Anmeldung Sie verwenden können und auf welche Konten Sie jeweils API-Aufrufe ausführen können.

Nutzer Kundennummer für die Anmeldung Konten für API-Aufrufe
U1, SA1 M1 M1, M2, A1, A2, A3
U2 M2 M2, A1, A2, A3
U2 M3 M3, A1, A4
U3 A4 A4

Sie können die Angabe des login-customer-id-Headers überspringen, wenn der Nutzer direkten Zugriff auf das Google Ads-Konto hat, für das Sie Aufrufe ausführen. Wenn Sie beispielsweise U3-Anmeldedaten verwenden, um einen Aufruf an A4 zu senden, müssen Sie den login-customer-id-Header nicht angeben, da die Google Ads-Server die Zugriffsebene anhand der Kunden-ID (A4) korrekt ermitteln können.

Wenn Sie eine Google Ads API-Clientbibliothek verwenden, geben Sie den login-customer-id-Header mit den folgenden Einstellungen an.

Java

Fügen Sie der Datei ads.properties die folgende Einstellung hinzu.

api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

.NET

Fügen Sie die folgende Einstellung hinzu, wenn Sie das GoogleAdsConfig-Objekt initialisieren und damit ein GoogleAdsClient-Objekt erstellen.

GoogleAdsConfig config = new GoogleAdsConfig()
{
    // ...
    LoginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"
};
GoogleAdsClient client = new GoogleAdsClient(config);

Python

Fügen Sie der Datei google-ads.yaml die folgende Einstellung hinzu.

login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE

PHP

Fügen Sie der Datei google_ads_php.ini die folgende Einstellung hinzu.

[GOOGLE_ADS]
loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"

Ruby

Fügen Sie der Datei google_ads_config.rb die folgende Einstellung hinzu.

Google::Ads::GoogleAds::Config.new do |c|
  c.login_customer_id = 'INSERT_LOGIN_CUSTOMER_ID_HERE'
end

Erstellen Sie eine GoogleAdsClient-Instanz, indem Sie den Pfad zum Speicherort dieser Datei übergeben.

client = Google::Ads::GoogleAds::GoogleAdsClient.new(
  'path/to/google_ads_config.rb'
)

Perl

Fügen Sie der Datei googleads.properties die folgende Einstellung hinzu.

loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

curl

Geben Sie beim Ausführen des curl-Befehls das folgende Befehlszeilenargument an.

-H "login-customer-id: INSERT_LOGIN_CUSTOMER_ID_HERE"

Mit der Methode CustomerService.ListAccessibleCustomers können Sie die Liste der Konten abrufen, auf die ein Nutzer direkten Zugriff hat. Diese Konten können als gültige Werte für den login-customer-id-Header verwendet werden.

Java

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);
    }
  }
}
      

C#

public void Run(GoogleAdsClient client)
{
    // Get the CustomerService.
    CustomerServiceClient customerService = client.GetService(Services.V25.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);
    }
}
      

Python

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}"')
      

Ruby

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
      

Perl

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;
}
      

curl

# Returns the resource names of customers directly accessible by the user
# authenticating the call.
#
# Variables:
#   API_VERSION,
#   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 "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
      

Was kann ich tun, wenn mit der Methode ListAccessibleCustomers meine Kunden-ID nicht abgerufen wird?

Wenn mit der Methode CustomerService.ListAccessibleCustomers keine Kunden-ID abgerufen wurde, die Sie in den Ergebnissen erwartet haben, kann das verschiedene Gründe haben.

  1. Sie haben Zugriff auf die Kundennummer, aber der Zugriff wird über ein übergeordnetes Verwaltungskonto gewährt. Wenn Sie beispielsweise die Methode ListAccessibleCustomers mit den Anmeldedaten des Nutzers U1 im vorherigen Beispiel aufrufen, gibt die Methode in den Ergebnissen nur M1 zurück, obwohl U1 Zugriff auf weitere Konten hat. Um diese Möglichkeit zu bestätigen, rufen Sie die Kontohierarchie ab, indem Sie für jedes der von der Methode ListAccessibleCustomers zurückgegebenen Konten search- oder searchStream-Abfragen für die Ressource customer_client ausführen. Dazu müssen Sie jedes dieser Konten als login-customer-id festlegen, wie im vorherigen Abschnitt beschrieben. Wenn Sie Zugriff auf das Zielkonto haben, können Sie es als Teil einer der Kontohierarchien abrufen.

  2. Sie verwenden falsche OAuth-Anmeldedaten. Am häufigsten liegt es daran, dass Sie die Anmeldedaten eines anderen Nutzers verwenden. Das kann beispielsweise passieren, wenn Sie Sandbox- oder Entwickleranmeldedaten versehentlich mit Produktionsanmeldedaten verwechseln oder die Anmeldedaten eines anderen Nutzers fälschlicherweise aus der Datenbank oder dem lokalen Cache lesen. Eine mögliche Methode zur Fehlerbehebung ist die Verwendung der Google People API, um den Namen und die E-Mail-Adresse des angemeldeten Nutzers abzurufen und zu prüfen, ob sie mit der erwarteten E-Mail-Adresse übereinstimmen.

  3. Sie haben keinen Zugriff auf das Konto. Folgen Sie der Anleitung für den Kontozugriff, um Zugriff auf das richtige Kundenkonto zu erhalten.

Nutzerrollen

Für die Google Ads API gibt es kein separates Zugriffsmodell und es werden auch keine separaten OAuth 2.0-Bereiche verwendet, um die Funktionalität einzuschränken. In der Google Ads API werden beispielsweise dieselben Bereiche für schreibgeschützte und Lese-/Schreibvorgänge verwendet. Stattdessen werden in der Google Ads API dieselben Nutzerrollen wie in Google Ads unterstützt. Wenn einem Konto auf Verwaltungskontoebene eine Nutzerrolle zugewiesen wird, wird die Rolle von den Konten in der Hierarchie übernommen. Wenn ein Nutzer für ein bestimmtes Konto widersprüchliche Rollen hat, wird die richtige Ebene durch das in der API-Anfrage angegebene login-customer-id-Konto bestimmt.

In der folgenden Tabelle wird die Kontohierarchie aus dem vorherigen Beispiel verwendet, um die Auswirkungen der Zuweisung verschiedener Nutzerrollen zu veranschaulichen.

Nutzer Nutzerrolle gewährt login-customer-id Tatsächliche Zugriffsebene
SA1 Standardzugriff auf Konto M1 M1 Standardzugriff auf M1, M2, A1, A2, A3
U2 Standardzugriff auf M2
Lesezugriff auf M3
M2 Standardzugriff auf M2, A1, A2, A3
U2 Standardzugriff auf M2
Lesezugriff auf M3
M3 Lesezugriff auf M3, A1, A4