执行 Google Workspace 全网域授权

Cloud Search Query API 要求使用 OAuth 授权 API 调用 您网域中获得许可的用户的所有凭据。默认情况下,服务 用于访问索引 API 和配置 API 的 用于查询 API 调用,因为他们不是使用 Cloud Search 的网域用户 或 Google Workspace 许可。如果您希望在没有问题时 对查询 API 调用进行身份验证,则网域管理员可以授权给该账号 对整个网域内的用户数据的访问权限 - 这称为 全网域授权。拥有受托人权限的服务账号 授权方可以模拟任何用户,包括有权访问 Cloud Search 的用户。

创建服务账号和凭据

如果您还没有服务账号凭据,请参阅 创建服务账号凭据

向您的服务账号进行全网域授权

要访问某个 Google Workspace 网域中的用户数据,必须选择 需要由网域的超级用户授予访问权限。 有关全网域授权的详细信息,请参阅 使用全网域授权功能控制 Google Workspace API 访问权限

如需将全网域授权委派给服务账号,请执行以下操作:

  1. 在您网域的管理控制台中,转到 主菜单 > 安全 >访问权限和数据控制 >API 控件
  2. 全网域授权窗格中,选择管理全网域授权 委托

  3. 点击新增

  4. 客户端 ID 字段中,输入从 服务账号创建步骤。

  5. OAuth 范围字段中,输入以逗号分隔的范围列表。 应用所需的资源使用范围 https://www.googleapis.com/auth/cloud_search.query(针对搜索应用) 使用 Query API。

  6. 点击授权

您的服务账号现在拥有 Cloud Search Query API 的全网域访问权限, 并且可以模拟此范围内网域的任何用户。您现在可以 代表您创建已获授权的 Cloud Search API 服务对象, 网域用户。

对 Cloud Search API 服务对象进行实例化

本部分介绍如何实例化 Cloud Search API 服务对象,然后 授权该服务账号使用 OAuth 2.0 和您服务账号的 执行 Google Workspace 全网域授权。示例 从 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)