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

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

Crea l'account di servizio e le credenziali

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

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

Per accedere ai dati utente in un dominio Google Workspace, il service account che hai creato deve essere concesso dall'accesso 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 nuova.

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

  5. Nel campo Ambiti OAuth, inserisci un elenco separato 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 che utilizzano l'API Query.

  6. Fai clic su Autorizza.

Ora il tuo account di servizio ha accesso all'API Cloud Search Query a livello di dominio e può rubare l'identità di qualsiasi utente del tuo dominio in questo ambito. Ora puoi inizializzare un oggetto di servizio dell'API Cloud Search autorizzato per conto degli utenti del tuo dominio.

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

Questa sezione mostra come creare un'istanza di un oggetto di servizio dell'API Cloud Search e poi autorizzarlo a effettuare richieste all'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)