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

L'API Cloud Search Query richiede che le chiamate API vengano 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 di query perché non sono utenti del dominio con licenze Cloud Search o Google Workspace. Se vuoi utilizzare un account di servizio durante l'autenticazione delle chiamate API Query, un amministratore di dominio può concedere all'account l'accesso ai dati dell'utente a livello di dominio (questa pratica è nota come delega dell'autorità a livello di dominio). Un account di servizio con autorizzazione 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 le credenziali dell'account di servizio.

Delega l'autorità a livello di dominio al tuo account di servizio

Per accedere ai dati utente di un dominio Google Workspace, l'account di servizio che hai creato deve disporre dell'accesso da parte di un super amministratore del dominio. Per saperne di più sulla delega a livello di dominio, vedi 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 durante i 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 con 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 puoi verificare un oggetto di servizio API Cloud Search autorizzato per conto degli utenti del tuo dominio.

Creare un'istanza per un oggetto di servizio dell'API Cloud Search

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