Déléguer les droits au niveau du domaine Google Workspace

L'API Cloud Search Query nécessite que les appels d'API soient autorisés à l'aide d'identifiants OAuth appartenant à un utilisateur disposant d'une licence dans votre domaine. Par défaut, les comptes de service, qui permettent d'accéder aux API d'indexation et de configuration, ne peuvent pas être utilisés pour les appels d'API de requête, car ce ne sont pas des utilisateurs de domaine disposant de licences Cloud Search ou Google Workspace. Si vous souhaitez utiliser un compte de service lors de l'authentification des appels d'API de requête, un administrateur de domaine peut accorder au compte un accès aux données utilisateur au niveau du domaine. C'est ce qu'on appelle la délégation d'autorité au niveau du domaine. Un compte de service disposant d'une autorité déléguée peut emprunter l'identité de n'importe quel utilisateur, y compris ceux ayant accès à Cloud Search.

Créer le compte de service et les identifiants

Si vous ne disposez pas encore d'identifiants de compte de service, consultez la section Créer des identifiants de compte de service.

Déléguer l'autorité au niveau du domaine à votre compte de service

Pour accéder aux données utilisateur d'un domaine Google Workspace, un super-administrateur du domaine doit accorder l'accès au compte de service que vous avez créé. Pour en savoir plus sur la délégation au niveau du domaine, consultez Contrôler l'accès à l'API Google Workspace à l'aide de la délégation au niveau du domaine.

Pour déléguer une autorité au niveau du domaine à un compte de service:

  1. Dans la console d'administration de votre domaine, accédez au Menu principal > Sécurité > Contrôle des accès et des données > Commandes des API.
  2. Dans le volet Délégation au niveau du domaine, sélectionnez Gérer la délégation au niveau du domaine.

  3. Cliquez sur Ajouter.

  4. Dans le champ ID client, saisissez l'ID client obtenu lors des étapes de création du compte de service ci-dessus.

  5. Dans le champ Champs d'application OAuth, saisissez la liste des champs d'application requis pour votre application, séparés par une virgule. Utilisez le champ d'application https://www.googleapis.com/auth/cloud_search.query pour les applications de recherche utilisant l'API Query.

  6. Cliquez sur Autoriser.

Votre compte de service dispose désormais d'un accès au niveau du domaine à l'API Cloud Search Query, et peut emprunter l'identité de n'importe quel utilisateur de votre domaine compris dans ce champ d'application. Vous êtes prêt à instancier un objet de service de l'API Cloud Search autorisé au nom des utilisateurs de votre domaine.

Instancier un objet de service de l'API Cloud Search

Cette section explique comment instancier un objet de service de l'API Cloud Search, puis l'autoriser à envoyer des requêtes API à l'aide d'OAuth 2.0 et des identifiants de votre compte de service pour effectuer la délégation au niveau du domaine Google Workspace. Les exemples lisent les informations du compte de service à partir du fichier de clé privée au format 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)