Delegar autoridade em todo o domínio do Google Workspace

A API Cloud Search Query exige que as chamadas de API sejam autorizadas usando credenciais do OAuth de um usuário licenciado no seu domínio. Por padrão, as contas de serviço usadas para acessar as APIs de indexação e configuração não podem ser usadas para chamadas da API Query porque não são usuários do domínio com licenças do Cloud Search ou do Google Workspace. Se você quiser usar uma conta de serviço ao autenticar chamadas da API Query, um administrador de domínio poderá conceder à conta acesso a dados do usuário em todo o domínio. Isso é conhecido como delegação de autoridade em todo o domínio. Uma conta de serviço com autoridade delegada pode representar qualquer usuário, incluindo aqueles com acesso ao Cloud Search.

Criar a conta de serviço e credenciais

Se você ainda não tiver credenciais de conta de serviço, consulte Criar credenciais de conta de serviço.

Delegar autoridade em todo o domínio à conta de serviço

Para acessar os dados do usuário em um domínio do Google Workspace, a conta de serviço criada precisa receber acesso de um superadministrador do domínio. Saiba mais sobre a delegação em todo o domínio em Controlar o acesso da API Google Workspace com a delegação em todo o domínio.

Para delegar autoridade em todo o domínio a uma conta de serviço:

  1. No Admin Console do domínio, acesse Menu principal > Segurança > Controle de dados e acesso > Controles de API.
  2. No painel Delegação em todo o domínio, selecione Gerenciar a delegação em todo o domínio.

  3. clique em Add new;

  4. No campo ID do cliente, insira o ID que consta nas etapas anteriores de criação da conta de serviço.

  5. No campo Escopos do OAuth, insira uma lista delimitada por vírgulas dos escopos necessários para o aplicativo. Use o escopo https://www.googleapis.com/auth/cloud_search.query para aplicativos de pesquisa que usam a API Query.

  6. Clique em Autorizar.

Sua conta de serviço agora tem acesso em todo o domínio à API Cloud Search Query e pode representar qualquer usuário do seu domínio nesse escopo. Você já pode instanciar um objeto de serviço autorizado da API Cloud Search em nome dos usuários do seu domínio.

Instanciar um objeto de serviço da API Cloud Search

Nesta seção, mostramos como instanciar um objeto de serviço da API Cloud Search e autorizá-lo a fazer solicitações de API usando o OAuth 2.0 e as credenciais da sua conta de serviço para realizar a delegação em todo o domínio do Google Workspace. Os exemplos leem as informações da conta de serviço no arquivo de chave privada formatado em 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)