Delegar autoridade em todo o domínio do G Suite

A API Query do Cloud Search exige que as chamadas de API sejam autorizadas usando credenciais do OAuth pertencentes a um usuário licenciado em 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 de domínio com licenças do Cloud Search ou do G Suite. Se você quiser usar uma conta de serviço ao autenticar chamadas da API Query, um administrador de domínio poderá conceder acesso a dados do usuário em todo o domínio da conta. 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 usuários 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

A conta de serviço que você criou precisa ter acesso aos dados de usuário do domínio do G Suite que você quer acessar. As seguintes tarefas precisam ser executadas por um usuário com acesso ao Admin Console:

  1. Acesse o Admin Console do seu domínio.
  2. Selecione Segurança na lista de controles. Caso você não veja Segurança na lista, selecione Mais controles na barra cinza na parte inferior da página e depois Segurança na lista de controles.
  3. Selecione Configurações avançadas na lista de opções.
  4. Selecione Gerenciar acesso de cliente de API na seção Autenticação.
  5. No campo Nome do cliente, insira o ID do cliente conseguido nas etapas acima de criação da conta de serviço.
  6. No campo Um ou mais escopos de API, insira os escopos necessários para seu aplicativo. Use o escopo https://www.googleapis.com/auth/cloud_search.query para aplicativos de pesquisa usando a API Query.
  7. Clique no botão Autorizar.

Sua conta de serviço agora tem acesso em todo o domínio à API Query do Cloud Search e pode representar qualquer usuário do seu domínio nesse escopo. Você está pronto para 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

Esta seção mostra 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 executar a delegação em todo o domínio do G Suite. Nos exemplos, as informações da conta de serviço são lidas do 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))
          .setServiceAccountUser(userEmail)
          .build();

     CloudSearch service = new CloudSearch.Builder(httpTransport, jsonFactory, creds).build();

     return service;
    }
    

Python

from googleapiclient.discovery import build
    from oauth2client.service_account import ServiceAccountCredentials

    # 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 = ServiceAccountCredentials.from_json_keyfile_name(
          SERVICE_ACCOUNT_FILE_PATH,
          scopes=['https://www.googleapis.com/auth/cloud_search.query'])

      credentials = credentials.create_delegated(user_email)

      return build("cloudsearch", "v1", credentials=credentials)