Delegare l'autorità a livello di dominio in Google Workspace

L'API Cloud Search Query richiede che le chiamate API siano autorizzate utilizzando credenziali OAuth appartenenti a un utente con licenza nel tuo dominio. Per impostazione predefinita, gli account di servizio utilizzati per accedere alle API di indicizzazione e configurazione non possono essere utilizzati per le chiamate API delle query perché non sono utenti del dominio con licenze Cloud Search o Google Workspace. Se vuoi utilizzare un account di servizio per l'autenticazione delle chiamate API di query, un amministratore di dominio può concedere all'account l'accesso ai dati utente a livello di dominio, una procedura nota come delega dell'autorità a livello di dominio. Un account di servizio con autorità delegata può impersonare qualsiasi utente, inclusi gli utenti con accesso a Cloud Search.

Crea l'account di servizio e le credenziali

Se non hai ancora le credenziali dell'account di servizio, consulta Creare credenziali dell'account di servizio.

Delega l'autorità a livello di dominio all'account di servizio

Per accedere ai dati utente in un dominio Google Workspace, l'account di servizio che hai creato deve essere autorizzato da un super amministratore del dominio. Per saperne di più sulla delega a livello di dominio, consulta Controllare l'accesso all'API Google Workspace con la delega a livello di dominio.

Per delegare l'autorità a livello di dominio a un account di servizio:

  1. Nella Console di amministrazione del tuo dominio, vai a Menu principale > Sicurezza > Accesso e controllo dei dati > Controlli API.
  2. Nel riquadro Delega a livello di dominio, seleziona Gestisci delega a livello di dominio.

  3. Fai clic su Aggiungi nuovo.

  4. Nel campo ID client, inserisci l'ID client ottenuto dai passaggi di creazione dell'account di servizio precedenti.

  5. Nel campo Ambiti OAuth, inserisci un elenco delimitato da virgole degli ambiti richiesti per la tua applicazione. Utilizza l'ambito https://www.googleapis.com/auth/cloud_search.query per le applicazioni di ricerca mediante l'API Query.

  6. Fai clic su Autorizza.

Il tuo account di servizio ora dispone dell'accesso a livello di dominio all'API Cloud Search Query e può impersonare qualsiasi utente del tuo dominio in questo ambito. Ora è tutto pronto per creare un oggetto di servizio autorizzato dell'API Cloud Search per conto degli utenti del tuo dominio.

Crea l'istanza di un oggetto di servizio API Cloud Search

Questa sezione mostra come creare l'istanza di un oggetto di servizio API Cloud Search e autorizzarlo a effettuare richieste API utilizzando OAuth 2.0 e le credenziali dell'account di servizio per eseguire la delega a livello di dominio di Google Workspace. Gli esempi leggono le informazioni dell'account di servizio contenute nel file di chiave privata in 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)