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

La API de Cloud Search Query requiere que las llamadas a la API estén autorizadas con las credenciales de OAuth que pertenecen a un usuario con licencia en tu dominio. Según la configuración predeterminada, las cuentas de servicio, que se usan para 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 o 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 suplantar a 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 Crea 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 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 la autoridad de todo el dominio a una cuenta de servicio, sigue estos pasos:

  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 delegación de todo el dominio.

  3. Haz clic en Add new (Agregar nuevo).

  4. En el campo ID de cliente, ingresa el ID de cliente obtenido de los pasos anteriores para crear la cuenta de servicio.

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

  6. Haz clic en Autorizar.

Tu cuenta de servicio ahora tiene acceso a todo el dominio de la API de Cloud Search Query y puede actuar en nombre de cualquier usuario de tu dominio en este alcance. Ya estás listo para crear una instancia de un objeto de servicio autorizado de la API de Cloud Search 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, luego, autorizarlo para realizar solicitudes a la API con OAuth 2.0 y las credenciales de tu cuenta de servicio a fin de realizar la delegación de todo el dominio de Google Workspace. Los ejemplos leen la información de la cuenta de servicio desde el 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)