Delegación de autoridad de Google Workspace en todo el dominio

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 APIs 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 Google Workspace. 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 Cómo crear credenciales de cuenta de servicio.

Delega autoridad en todo el dominio a tu cuenta de servicio

Para acceder a los datos del usuario en un dominio de Google Workspace, un administrador avanzado del dominio debe otorgar acceso a la cuenta de servicio que creaste. Para obtener más información sobre la delegación de todo el dominio, consulta Cómo controlar el acceso a la API de Google Workspace con la delegación de todo el dominio.

Para delegar autoridad en todo el dominio a una cuenta de servicio, haz lo siguiente:

  1. En la Consola del administrador de tu dominio, ve a Menú principal > Seguridad > Control de acceso y datos > Controles de API.
  2. En el panel Delegación de todo el dominio, selecciona Administrar la delegación de todo el dominio.

  3. Haz clic en Agregar nueva.

  4. En el campo ID de cliente, ingresa el ID de cliente obtenido de los pasos de creación de la cuenta de servicio anteriores.

  5. En el campo OAuth Scopes, ingresa una lista de los permisos necesarios para tu aplicación, delimitada por comas. Usa el permiso https://www.googleapis.com/auth/cloud_search.query para las aplicaciones de búsqueda que usan la API de consultas.

  6. Haz clic en 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 de tu dominio en este alcance. Está todo 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 para 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 Google Workspace. 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_QUERY))
      .setServiceAccountUser(userEmail)
      .build();

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

  return service;
}

Python

from google.oauth2 import service_account
from googleapiclient.discovery import build

# 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 = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE_PATH,
        scopes=['https://www.googleapis.com/auth/cloud_search.query'])

    delegated_credentials = credentials.with_subject(user_email)

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