Melakukan delegasi otoritas di seluruh domain Google Workspace

Cloud Search Query API mewajibkan panggilan API diotorisasi menggunakan kredensial OAuth milik pengguna berlisensi di domain Anda. Secara default, akun layanan, yang digunakan untuk mengakses API pengindeksan dan konfigurasi, tidak dapat digunakan untuk panggilan API kueri karena bukan pengguna domain dengan lisensi Cloud Search atau Google Workspace. Jika Anda ingin menggunakan akun layanan saat mengautentikasi panggilan API kueri, administrator domain dapat memberikan akses seluruh domain ke data pengguna kepada akun tersebut — hal ini dikenal sebagai delegasi otoritas tingkat domain. Akun layanan dengan otoritas yang didelegasikan dapat meniru identitas pengguna mana pun, termasuk pengguna yang memiliki akses ke Cloud Search.

Membuat akun layanan dan kredensial

Jika Anda belum memiliki kredensial akun layanan, lihat Membuat kredensial akun layanan.

Mendelegasikan otoritas seluruh domain ke akun layanan Anda

Untuk mengakses data pengguna di domain Google Workspace, akun layanan yang Anda buat harus diberi akses oleh administrator super untuk domain tersebut. Untuk mengetahui informasi selengkapnya tentang delegasi tingkat domain, lihat Mengontrol akses Google Workspace API dengan delegasi seluruh domain.

Untuk mendelegasikan otoritas seluruh domain ke akun layanan:

  1. Dari konsol Admin domain, buka Menu utama > Keamanan > Kontrol data dan akses > Kontrol API.
  2. Di panel Domain wide Delegation, pilih Manage Domain Wide Delegation.

  3. Klik Tambahkan baru.

  4. Di kolom Client-ID, masukkan client ID yang diperoleh dari langkah-langkah pembuatan akun layanan di atas.

  5. Di kolom OAuth Scopes, masukkan daftar cakupan yang dipisahkan koma yang diperlukan untuk aplikasi Anda. Gunakan cakupan https://www.googleapis.com/auth/cloud_search.query untuk aplikasi penelusuran yang menggunakan Query API.

  6. Klik Authorize.

Akun layanan Anda kini memiliki akses seluruh domain ke Cloud Search Query API, dan dapat meniru identitas pengguna domain Anda mana pun dalam cakupan ini. Anda siap membuat instance objek layanan Cloud Search API yang diotorisasi atas nama pengguna domain Anda.

Membuat instance objek layanan Cloud Search API

Bagian ini menunjukkan cara membuat instance objek layanan Cloud Search API, lalu mengizinkannya untuk membuat permintaan API menggunakan OAuth 2.0 dan kredensial akun layanan Anda untuk melakukan delegasi seluruh domain Google Workspace. Contoh tersebut membaca informasi akun layanan dari file kunci pribadi berformat 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)