API запросов Cloud Search требует, чтобы вызовы API были авторизованы с использованием учетных данных OAuth, принадлежащих лицензированному пользователю в вашем домене. По умолчанию сервисные учетные записи, которые используются для доступа к API индексирования и настройки, не могут использоваться для вызовов API запросов, поскольку они не являются пользователями домена с лицензиями Cloud Search или Google Workspace. Если вы хотите использовать учетную запись службы при аутентификации вызовов API-запросов, администратор домена может предоставить учетной записи доступ к данным пользователя на уровне домена — это называется делегированием полномочий на уровне домена . Сервисный аккаунт с делегированными полномочиями может выдавать себя за любого пользователя, включая пользователей с доступом к Cloud Search.
Создайте учетную запись службы и учетные данные.
Если у вас еще нет учетных данных сервисной учетной записи, см. раздел Создание учетных данных сервисной учетной записи .
Делегируйте полномочия на уровне домена своему сервисному аккаунту
Чтобы получить доступ к пользовательским данным в домене Google Workspace, созданному вами сервисному аккаунту должен быть предоставлен доступ от суперадминистратора домена. Дополнительную информацию о делегировании на уровне домена см. в разделе Управление доступом к Google Workspace API с помощью делегирования на уровне домена .
Чтобы делегировать полномочия на уровне домена сервисному аккаунту:
- В консоли администратора вашего домена выберите Главное > Безопасность > Управление доступом и данными > Управление API .
В области делегирования на уровне домена выберите «Управление делегированием на уровне домена» .
Нажмите Добавить новый .
В поле «Идентификатор клиента» введите идентификатор клиента, полученный на этапах создания учетной записи службы, описанных выше.
В поле «Области OAuth» введите через запятую список областей, необходимых для вашего приложения. Используйте область
https://www.googleapis.com/auth/cloud_search.query
для поисковых приложений, использующих API запросов.Нажмите «Авторизовать» .
Теперь ваш сервисный аккаунт имеет доступ к Cloud Search Query 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)