Delegación de autoridad de todo el dominio de G Suite

La API de consulta de Cloud Search requiere que las llamadas a la API estén autorizadas con las credenciales de OAuth que pertenecen a un usuario con licencia de tu dominio. De forma predeterminada, las cuentas de servicio usadas a fin de acceder a las API de indexación y configuración no se pueden usar para llamadas a la API de consulta porque no son usuarios de dominio con licencias de Cloud Search ni G Suite. Si deseas usar una cuenta de servicio cuando autenticas las llamadas a la API de consulta, un administrador de dominio puede otorgar a la cuenta acceso de todo el dominio a los datos del usuario; esto se conoce como delegación de autoridad en todo el dominio. Una cuenta de servicio con autoridad delegada puede tomar la identidad de cualquier usuario, incluidos los usuarios con acceso a Cloud Search.

Crea la cuenta de servicio y las credenciales

Si aún no tienes credenciales de cuenta de servicio, consulta la sección sobre cómo crear credenciales de cuenta de servicio.

Delega autoridad en todo el dominio a tu cuenta de servicio

La cuenta de servicio que creaste debe tener acceso a los datos del usuario del dominio de G Suite a los que deseas acceder. Un usuario con acceso a la Consola del administrador debe realizar las tareas siguientes:

  1. Dirígete a la Consola del administrador de tu dominio.
  2. Selecciona Seguridad en la lista de controles. Si Seguridad no aparece en la lista, selecciona Más controles en la barra color gris en la parte inferior de la página; luego, selecciona Seguridad en la lista de controles.
  3. Selecciona Configuración avanzada en la lista de opciones.
  4. Selecciona Administrar acceso de cliente de API en la sección Autenticación.
  5. En el campo Nombre del cliente, ingresa el ID del cliente obtenido de los pasos de creación de la cuenta de servicio anteriores.
  6. En el campo Uno o más alcances para la API, ingresa los alcances necesarios destinados a la aplicación. Use el alcance https://www.googleapis.com/auth/cloud_search.query para las aplicaciones de búsqueda que usan la API de consultas.
  7. Haz clic en el botón Autorizar.

Tu cuenta de servicio ahora tiene acceso en todo el dominio de la API de consulta de Cloud Search y puede tomar la identidad de cualquier usuario del dominio en este alcance. Estás listo para crear una instancia de un objeto de servicio de la API de Cloud Search autorizado en nombre de los usuarios de tu dominio.

Crea una instancia de un objeto de servicio de la API de Cloud Search

En esta sección, se muestra cómo crear una instancia de un objeto de servicio de la API de Cloud Search y autorizarlo a fin de que realice solicitudes a la API con OAuth 2.0 y las credenciales de tu cuenta de servicio para realizar una delegación de todo el dominio de G Suite. Los ejemplos leen la información de la cuenta de servicio del archivo de claves privadas con formato JSON.

Java

import java.util.Collections;
    import java.io.FileInputStream;
    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.json.JsonFactory;
    import com.google.api.services.cloudsearch.v1.CloudSearch;
    import com.google.api.services.cloudsearch.v1.CloudSearchScopes;
    ...

    /** Path to the Service Account's Private Key file */
    private static final String SERVICE_ACCOUNT_FILE_PATH = "/path/to/key.json";

    /**
     * Build and return a Cloud Search service object authorized with the service
     * account that acts on behalf of the given user.
     *
     * @param userEmail The email of the user to impersonate. Needs permissions to access Cloud Search.
     * @return CloudSearch service object that is ready to make requests.
     */
    public static CloudSearch getCloudSearchAPIService(String userEmail)
        throws FileNotFoundException, IOException {

      FileInputStream credsFile = new FileInputStream(SERVICE_ACCOUNT_FILE_PATH);

      GoogleCredential init = GoogleCredential.fromStream(credsFile);

      HttpTransport httpTransport = init.getTransport();
      JsonFactory jsonFactory = init.getJsonFactory();

      GoogleCredential creds = new GoogleCredential.Builder()
          .setTransport(httpTransport)
          .setJsonFactory(jsonFactory)
          .setServiceAccountId(init.getServiceAccountId())
          .setServiceAccountPrivateKey(init.getServiceAccountPrivateKey())
          .setServiceAccountScopes(Collections.singleton(CloudSearchScopes.CLOUD_SEARCH))
          .setServiceAccountUser(userEmail)
          .build();

     CloudSearch service = new CloudSearch.Builder(httpTransport, jsonFactory, creds).build();

     return service;
    }
    

Python

from googleapiclient.discovery import build
    from oauth2client.service_account import ServiceAccountCredentials

    # Path to the Service Account's Private Key file
    SERVICE_ACCOUNT_FILE_PATH = "/path/to/key.json"

    def create_query_api_service(user_email):
      """Build and return a CloudSearch service object authorized with the service
      account that acts on behalf of the given user.

      Args:
        user_email: The email of the user to impersonate. Needs permissions to access Cloud Search.
      Returns:
        Cloud Search Query API service object that is ready to make requests.
      """

      credentials = ServiceAccountCredentials.from_json_keyfile_name(
          SERVICE_ACCOUNT_FILE_PATH,
          scopes=['https://www.googleapis.com/auth/cloud_search.query'])

      credentials = credentials.create_delegated(user_email)

      return build("cloudsearch", "v1", credentials=credentials)