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 des 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 interroger les appels d'API, 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 doté d'une autorité déléguée peut emprunter l'identité de n'importe quel utilisateur, y compris de 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 une autorité au niveau du domaine à votre compte de service

Pour que vous puissiez 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 avec 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 dans ce champ d'application. Vous êtes prêt à instancier un objet de service de l'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 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. Ces 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)