Información sobre el modelo de acceso de Google Ads

Existen dos tipos de cuentas de Google Ads: las cuentas de administrador de Google Ads y las cuentas de anunciante de Google Ads (también conocidas como cuentas de cliente). Las cuentas de administrador pueden administrar otras cuentas de administrador de Google Ads o cuentas de anunciante de Google Ads. Puedes vincular una cuenta de anunciante a una cuenta de administrador y, luego, administrar la cuenta de anunciante a través de la cuenta de administrador. La estructura vinculada general es un grafo acíclico dirigido con cuentas de anunciantes en el nivel de hoja.

Puedes otorgar acceso a las cuentas de Google Ads a usuarios individuales o cuentas de servicio. Existen dos formas de otorgarles a los usuarios acceso a una cuenta de anunciante:

  • Invita al usuario a la cuenta del anunciante para otorgarle acceso directo.
  • Otorga al usuario acceso indirecto a la cuenta del anunciante invitándolo a una cuenta de administrador vinculada a esa cuenta. El usuario obtiene acceso a la cuenta de anunciante, ya que la cuenta de administrador tiene acceso a todas las cuentas vinculadas a ella.

También puedes asignar roles de usuario cuando invitas a un usuario a administrar una cuenta.

Considera la siguiente jerarquía de cuentas. Supón que todos los usuarios tienen acceso estándar.

Diagrama de una jerarquía de cuentas

En la siguiente tabla, se resume la estructura de esta cuenta.

Usuario Tiene acceso directo a Tiene acceso indirecto a
U1, SA1 M1 M2, A1, A2, A3
U2 M2 y M3 A1, A2, A3 y A4
U3 A4  

ID de cliente de acceso

Un usuario puede tener acceso a varias jerarquías de cuentas. Cuando realices una llamada a la API en estos casos, deberás especificar la cuenta raíz que se usará para determinar correctamente los niveles de autorización y acceso a la cuenta. Para ello, especifica un encabezado login-customer-id como parte de la solicitud a la API.

En la siguiente tabla, se usa la jerarquía de cuentas del ejemplo anterior para mostrar qué IDs de cliente de acceso puedes usar y la lista correspondiente de cuentas a las que puedes realizar llamadas.

Usuario ID de cliente de acceso que se usará Cuentas para realizar llamadas a la API
U1, SA1 M1 M1, M2, A1, A2, A3
U2 M2 M2, A1, A2, A3
U2 M3 M3, A1 y A4
U3 A4 A4

Puedes omitir el encabezado login-customer-id si el usuario tiene acceso directo a la cuenta de Google Ads a la que realizas llamadas. Por ejemplo, no es necesario que especifiques el encabezado login-customer-id cuando usas credenciales de U3 para hacer una llamada a A4, ya que los servidores de Google Ads pueden determinar correctamente el nivel de acceso a partir del ID de cliente (A4).

Si usas una de nuestras bibliotecas cliente, usa la siguiente configuración para especificar el encabezado login-customer-id.

Java

Agrega el siguiente parámetro de configuración a tu archivo ads.properties.

api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

C#

Agrega el siguiente parámetro de configuración cuando inicialices el objeto GoogleAdsConfig y úsalo para crear un objeto GoogleAdsClient.

GoogleAdsConfig config = new GoogleAdsConfig()
{
    ...
    LoginCustomerId = ******
};
GoogleAdsClient client = new GoogleAdsClient(config);

PHP

Agrega el siguiente parámetro de configuración a tu archivo google_ads_php.ini.

[GOOGLE_ADS]
loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"

Python

Agrega el siguiente parámetro de configuración a tu archivo google-ads.yaml.

login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE

Ruby

Agrega el siguiente parámetro de configuración a tu archivo google_ads_config.rb.

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

Crea una instancia de GoogleAdsClient pasando la ruta de acceso a la ubicación en la que guardas este archivo.

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

Perl

Agrega el siguiente parámetro de configuración a tu archivo googleads.properties.

loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

curl

Especifica el siguiente argumento de línea de comandos cuando ejecutes el comando curl.

-H "login-customer-id: LOGIN_CUSTOMER_ID"

Puedes usar el método CustomerService.ListAccessibleCustomers para recuperar la lista de cuentas a las que un usuario tiene acceso directo. Estas cuentas se pueden usar como valores válidos para el encabezado login-customer-id.

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

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

Funciones de usuario

La API de Google Ads no tiene su propio modelo de acceso independiente ni usa alcances de OAuth 2.0 separados para limitar la funcionalidad. Por ejemplo, la API de Google Ads usa los mismos alcances para las operaciones de solo lectura y de lectura y escritura. En cambio, la API de Google Ads sigue los mismos roles de usuario que admite Google Ads. Cuando se otorga un rol de usuario a una cuenta a nivel de la cuenta de administrador, las cuentas de la jerarquía heredan el rol. Si un usuario tiene roles en conflicto para una cuenta determinada, el nivel correcto se resuelve con la cuenta login-customer-id especificada en la solicitud de la API.

En la siguiente tabla, se usa la jerarquía de cuentas del ejemplo anterior y se muestra el efecto de otorgar varios roles de usuario a los usuarios.

Usuario Se otorgó el rol del usuario login-customer-id Nivel de acceso efectivo
SA1 Acceso estándar en la cuenta M1 M1 Acceso estándar en M1, M2, A1, A2 y A3
U2 Acceso estándar en M2
Acceso de solo lectura en M3
M2 Acceso estándar en M2, A1, A2 y A3
U2 Acceso estándar en M2
Acceso de solo lectura en M3
M3 Acceso de solo lectura en M3, A1 y A4