A API Query do Google Cloud Search exige que as chamadas sejam autorizadas por um usuário licenciado do domínio. Como as contas de serviço não são usuários de domínio licenciados, elas não podem chamar a API Query por padrão. Para permitir que uma conta de serviço faça chamadas da API Query, um administrador de domínio pode usar a delegação de autoridade em todo o domínio para conceder à conta de serviço acesso aos dados do usuário do seu domínio. Uma conta de serviço com autoridade delegada pode representar qualquer usuário com acesso ao Cloud Search.
Criar a conta de serviço e credenciais
Se você 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, um superadministrador do domínio precisa conceder acesso à sua conta de serviço. Para mais informações, consulte Controlar o acesso à API do 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:
- No Admin Console do seu domínio, acesse Menu principal > Segurança > Controle de acesso e dados > Controles de API.
- No painel Delegação em todo o domínio, selecione Gerenciar a delegação em todo o domínio.
- Clique em Adicionar novo.
- No campo ID do cliente, insira o ID do cliente da sua conta de serviço.
- No campo Escopos do OAuth, insira uma lista separada por vírgulas dos escopos
necessários. Use
https://www.googleapis.com/auth/cloud_search.querypara aplicativos de pesquisa. - Clique em 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. Agora você 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
Esta seção mostra como instanciar e autorizar um objeto de serviço da API Cloud Search usando o OAuth 2.0 e as credenciais da sua conta de serviço. Esses exemplos leem informações do arquivo de chave privada JSON da conta de serviço.
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.
*
* @param userEmail The email of the user to impersonate.
* @return CloudSearch service object.
*/
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();
return new CloudSearch.Builder(httpTransport, jsonFactory, creds).build();
}
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 Cloud Search service object.
Args:
user_email: The email of the user to impersonate.
Returns:
Cloud Search Query API service object.
"""
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)