Делегирование полномочий Google Workspace на уровне домена.

Для работы API запросов Cloud Search требуется, чтобы вызовы API были авторизованы с использованием учётных данных OAuth, принадлежащих лицензированному пользователю в вашем домене. По умолчанию учётные записи служб, используемые для доступа к API индексации и настройки, не могут использоваться для вызовов API запросов, поскольку они не являются пользователями домена с лицензиями Cloud Search или Google Workspace. Если вы хотите использовать учётную запись службы при аутентификации вызовов API запросов, администратор домена может предоставить этой учётной записи доступ к пользовательским данным на уровне домена — это называется делегированием полномочий на уровне домена . Учётная запись службы с делегированными полномочиями может выдавать себя за любого пользователя, включая пользователей с доступом к Cloud Search.

Создайте учетную запись службы и учетные данные

Если у вас еще нет учетных данных сервисной учетной записи, см. раздел Создание учетных данных сервисной учетной записи .

Делегируйте полномочия на уровне домена вашей учетной записи службы

Для доступа к данным пользователей в домене Google Workspace созданной вами учетной записи службы должен быть предоставлен доступ суперадминистратором домена. Подробнее о делегировании на уровне домена см. в статье Управление доступом к API Google Workspace с помощью делегирования на уровне домена .

Чтобы делегировать полномочия на уровне всего домена учетной записи службы:

  1. В консоли администратора вашего домена перейдите в Главное > Безопасность > Управление доступом и данными > Элементы управления API .
  2. На панели «Делегирование на уровне домена» выберите «Управление делегированием на уровне домена» .

  3. Нажмите Добавить новый .

  4. В поле «Идентификатор клиента» введите идентификатор клиента, полученный при создании учетной записи службы, описанном выше.

  5. В поле «Области действия OAuth» введите список областей действия OAuth, разделённых запятыми, необходимых для вашего приложения. Для поисковых приложений, использующих API запросов, используйте область действия https://www.googleapis.com/auth/cloud_search.query .

  6. Нажмите «Авторизовать» .

Теперь ваша учётная запись службы имеет доступ к API запросов Cloud Search на уровне всего домена и может выдавать себя за любого пользователя вашего домена в этой области. Вы готовы создать экземпляр авторизованного объекта службы API Cloud Search от имени пользователей вашего домена.

Создать объект службы API облачного поиска

В этом разделе показано, как создать экземпляр сервисного объекта Cloud Search API, а затем авторизовать его для выполнения API-запросов с использованием OAuth 2.0 и учетных данных вашей учетной записи службы для делегирования полномочий Google Workspace на уровне домена. В примерах информация учетной записи службы считывается из файла закрытого ключа в формате JSON.

Ява

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;
}

Питон

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)