Domainweite Übertragung von Befugnissen in Google Workspace

Für die Cloud Search Query API müssen API-Aufrufe mit OAuth-Anmeldedaten eines lizenzierten Nutzers in Ihrer Domain autorisiert werden. Standardmäßig können Dienstkonten, die für den Zugriff auf die Indexierungs- und Konfigurations-APIs verwendet werden, nicht für Query API-Aufrufe verwendet werden, da sie keine Domainnutzer mit Cloud Search- oder Google Workspace-Lizenzen sind. Wenn Sie ein Dienstkonto für die Authentifizierung von Query API-Aufrufen verwenden möchten, kann ein Domainadministrator dem Konto domainweiten Zugriff auf Nutzerdaten gewähren. Dies wird als domainweite Delegierung von Berechtigungen bezeichnet. Ein Dienstkonto mit delegierter Berechtigung kann die Identität eines beliebigen Nutzers übernehmen, auch von Nutzern mit Zugriff auf Cloud Search.

Dienstkonto und Anmeldedaten erstellen

Wenn Sie noch keine Dienstkontoanmeldedaten haben, lesen Sie den Abschnitt Dienstkontoanmeldedaten erstellen.

Domainweite Befugnisse an Ihr Dienstkonto delegieren

Damit auf Nutzerdaten in einer Google Workspace-Domain zugegriffen werden kann, muss dem von Ihnen erstellten Dienstkonto von einem Super Admin der Domain Zugriff gewährt werden. Weitere Informationen zur domainweiten Delegierung finden Sie unter Google Workspace-API-Zugriff mit domainweiter Delegierung verwalten.

So delegieren Sie domainweite Befugnisse an ein Dienstkonto:

  1. Rufen Sie in der Admin-Konsole Ihrer Domain das Hauptmenü > Sicherheit > Zugriffs- und Datenkontrolle > API-Steuerung auf.
  2. Wählen Sie im Bereich Domainweite Delegierung die Option Domainweite Delegierung verwalten aus.

  3. Klicken Sie auf Neu hinzufügen.

  4. Geben Sie im Feld Client-ID die Client-ID ein, die Sie oben beim Erstellen des Dienstkontos erhalten haben.

  5. Geben Sie im Feld OAuth-Bereiche eine durch Kommas getrennte Liste der für Ihre Anwendung erforderlichen Bereiche ein. Verwenden Sie den Bereich https://www.googleapis.com/auth/cloud_search.query für Suchanwendungen, die die Query API verwenden.

  6. Klicken Sie auf Autorisieren.

Ihr Dienstkonto hat jetzt domainweiten Zugriff auf die Cloud Search Query API und kann die Identität eines beliebigen Nutzers Ihrer Domain in diesem Bereich übernehmen. Sie können jetzt ein autorisiertes Cloud Search API-Dienstobjekt im Namen der Nutzer Ihrer Domain instanziieren.

Cloud Search API-Dienstobjekt instanziieren

In diesem Abschnitt wird gezeigt, wie Sie ein Cloud Search API-Dienstobjekt instanziieren und es dann autorisieren, API-Anfragen mit OAuth 2.0 und den Anmeldedaten Ihres Dienstkontos zu stellen, um die domainweite Delegierung von Google Workspace durchzuführen. In den Beispielen werden die Informationen des Dienstkontos aus der JSON-Datei mit dem privaten Schlüssel gelesen.

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)