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

L'API Cloud Search Query exige 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 ils 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 au niveau du domaine aux données utilisateur. Il s'agit de la délégation d'autorité au niveau du domaine. Un compte de service disposant d'une autorité déléguée peut usurper l'identité de n'importe quel utilisateur, y compris des utilisateurs 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 aux API Google Workspace à l'aide de la délégation au niveau du domaine.

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

  1. Dans la console d'administration de votre domaine, accédez à 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 à l'étape de création du compte de service ci-dessus.

  5. Dans le champ Champs d'application OAuth, saisissez une 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 à l'aide de 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 usurper l'identité de n'importe quel utilisateur de votre domaine dans ce champ d'application. Vous êtes prêt à instancier un objet de service API Cloud Search autorisé pour le compte 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 à effectuer des requêtes d'API à l'aide d'OAuth 2.0 et des identifiants de votre compte de service pour effectuer une 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)