Google Ads erişim modelini anlama

İki tür Google Ads hesabı vardır: Google Ads yönetici hesapları ve Google Ads reklamveren hesapları. Bu terimlerin ve diğerlerinin (ör. müşteri hesabı ve müşteri) nasıl ilişkili olduğuyla ilgili ayrıntılı açıklama için Hesap türleri başlıklı makaleyi inceleyin.

Yönetici hesapları, diğer Google Ads yönetici hesaplarını veya Google Ads reklamveren hesaplarını yönetebilir. Bir reklamveren hesabını yönetici hesabına bağlayabilir ve ardından reklamveren hesabını yönetici hesabı üzerinden yönetebilirsiniz. Genel bağlı yapı, yaprak düzeyinde reklamveren hesaplarının bulunduğu bir yönlendirilmiş döngüsüz grafiktir.

Google Ads hesaplarına tek tek kullanıcılara veya hizmet hesaplarına erişim izni verebilirsiniz. Kullanıcılara bir reklamveren hesabına erişim izni vermenin iki yolu vardır:

  • Kullanıcıyı ilgili hesaba davet ederek reklamveren hesabına doğrudan erişim izni verin.
  • Kullanıcıyı bu hesaba bağlı bir yönetici hesabına davet ederek reklamveren hesabına dolaylı erişim izni verin. Yönetici hesabı, altında bağlı tüm hesaplara erişebildiğinden kullanıcı, reklamveren hesabına erişim kazanır.

Bir kullanıcıyı hesap yönetmeye davet ettiğinizde kullanıcı rolleri de atayabilirsiniz.

Aşağıdaki hesap hiyerarşisini ele alalım. Tüm kullanıcıların standart erişime sahip olduğunu varsayın.

M1, M2 ve M3 yönetici hesaplarının A1-A4 reklamveren hesaplarına bağlı olduğunu gösteren şema.

Aşağıdaki tabloda bu hesap yapısı özetlenmektedir.

Kullanıcı Aşağıdakilere doğrudan erişimi olmalıdır: Aşağıdakilere dolaylı erişimi olmalıdır:
U1, SA1 M1 M2, A1, A2, A3
U2 M2, M3 A1, A2, A3, A4
U3 A4  

Giriş müşteri kimliği

Bir kullanıcı birden fazla hesap hiyerarşisine erişebilir. Bu gibi durumlarda API çağrısı yaparken yetkilendirme ve hesap erişim düzeylerini doğru şekilde belirlemek için kullanılacak kök hesabı belirtmeniz gerekir. Bunu yapmak için API isteğinize login-customer-id başlığını ekleyin.

Aşağıdaki tabloda, hangi giriş müşteri kimliklerini kullanabileceğinizi ve çağrı yapabileceğiniz ilgili hesap listesini göstermek için önceki örnekteki hesap hiyerarşisi kullanılmaktadır.

Kullanıcı Kullanmak için oturum açma müşteri kimliği API çağrısı yapılacak hesaplar
U1, SA1 M1 M1, M2, A1, A2, A3
U2 M2 M2, A1, A2, A3
U2 M3 M3, A1, A4
U3 A4 A4

Kullanıcının, çağrı yaptığınız Google Ads hesabına doğrudan erişimi varsa login-customer-id üstbilgisini sağlamayı atlayabilirsiniz. Örneğin, login-customer-id kimlik bilgilerini kullanarak A4 için çağrı yaparken U3 başlığını belirtmeniz gerekmez. Çünkü Google Ads sunucuları, erişim düzeyini müşteri kimliğinden (A4) doğru şekilde belirleyebilir.

Google Ads API istemci kitaplığı kullanıyorsanız login-customer-id üstbilgisini belirtmek için aşağıdaki ayarları kullanın.

Java

ads.properties dosyanıza aşağıdaki ayarı ekleyin.

api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

.NET

GoogleAdsConfig nesnesini başlatırken aşağıdaki ayarı ekleyin ve GoogleAdsClient nesnesi oluşturmak için kullanın.

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

Python

google-ads.yaml dosyanıza aşağıdaki ayarı ekleyin.

login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE

PHP

google_ads_php.ini dosyanıza aşağıdaki ayarı ekleyin.

[GOOGLE_ADS]
loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"

Ruby

google_ads_config.rb dosyanıza aşağıdaki ayarı ekleyin.

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

Bu dosyayı sakladığınız yerin yolunu ileterek bir GoogleAdsClient örneği oluşturun.

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

Perl

googleads.properties dosyanıza aşağıdaki ayarı ekleyin.

loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

curl

curl komutunu çalıştırırken aşağıdaki komut satırı bağımsız değişkenini belirtin.

-H "login-customer-id: INSERT_LOGIN_CUSTOMER_ID_HERE"

Kullanıcının doğrudan erişebildiği hesapların listesini almak için CustomerService.ListAccessibleCustomers yöntemini kullanabilirsiniz. Bu hesaplar, login-customer-id üstbilgisi için geçerli değerler olarak kullanılabilir.

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}" \
      

ListAccessibleCustomers yöntemiyle müşteri kimliğim alınamıyorsa ne yapmalıyım?

CustomerService.ListAccessibleCustomers yöntemi, sonuçlarda görünmesini beklediğiniz bir müşteri kimliğini almadıysa bunun birkaç olası nedeni vardır.

  1. Müşteri kimliğine erişiminiz var ancak erişim bir üst yönetici hesabı üzerinden veriliyor. Örneğin, önceki örnekte ListAccessibleCustomers yöntemini U1 kullanıcı kimlik bilgileriyle çağırırsanız U1 daha fazla hesaba erişimi olmasına rağmen yöntem sonuçlarda yalnızca M1 değerini döndürür. Bu olasılığı doğrulamak için search veya searchStream sorgularını ListAccessibleCustomers yöntemi tarafından döndürülen hesapların her biri için customer_client kaynağına karşı yürüterek hesap hiyerarşisini alın. Bunu yapmak için önceki bölümde açıklandığı gibi bu hesapların her birini login-customer-id olarak ayarlayın. Hedef hesaba erişiminiz varsa hesap hiyerarşilerinden birinin parçası olarak getirebilirsiniz.

  2. Yanlış OAuth kimlik bilgileri kullanıyorsunuz. En yaygın senaryo, farklı bir kullanıcının kimlik bilgilerini kullanmanızdır. Örneğin, test ortamı veya geliştirici kimlik bilgilerinin üretim kimlik bilgileriyle yanlışlıkla karıştırılması ya da veritabanından veya yerel önbellekten farklı bir kullanıcının kimlik bilgilerinin yanlış okunması bu duruma neden olabilir. Bu sorunu gidermenin olası bir yolu, oturum açmış kullanıcının adını ve e-posta adresini almak için Google People API'yi kullanmak ve bunun beklediğiniz e-posta adresiyle eşleşip eşleşmediğini doğrulamaktır.

  3. Hesaba erişiminiz yok. Doğru müşteri hesabına erişmek için hesap erişimi kılavuzunu inceleyin.

Kullanıcı rolleri

Google Ads API'nin kendi erişim modeli yoktur veya işlevselliği sınırlamak için ayrı OAuth 2.0 kapsamları kullanılmaz. Örneğin, Google Ads API, salt okunur ve okuma/yazma işlemleri için aynı kapsamları kullanır. Bunun yerine, Google Ads API, Google Ads'in desteklediği kullanıcı rollerini kullanır. Bir hesaba yönetici düzeyinde kullanıcı rolü verildiğinde bu rol, hiyerarşideki hesaplar tarafından devralınır. Bir kullanıcının belirli bir hesapla ilgili çakışan rolleri varsa doğru düzey, API isteğinde belirtilen login-customer-id hesabı tarafından belirlenir.

Aşağıdaki tabloda, önceki örnekteki hesap hiyerarşisi kullanılarak kullanıcılara çeşitli kullanıcı rolleri vermenin etkisi gösterilmektedir.

Kullanıcı Kullanıcı rolü verildi login-customer-id Etkili erişim düzeyi
SA1 M1 hesabında standart erişim M1 M1, M2, A1, A2, A3 üzerinde standart erişim
U2 M2'de standart erişim
M3'te salt okuma erişimi
M2 M2, A1, A2, A3'te standart erişim
U2 M2'de standart erişim
M3'te salt okuma erişimi
M3 M3, A1, A4'te salt okuma erişimi