执行 G Suite 全网域授权

Cloud Search Query API 要求使用属于您网域中已获许可用户的 OAuth 凭据来授权 API 调用。默认情况下,用于访问索引和配置 API 的服务帐号不能用于查询 API 调用,因为这些帐号并非具有 Cloud Search 或 G Suite 许可证的网域用户。如果您希望在对查询 API 调用执行身份验证时使用服务帐号,则网域管理员可以授予该帐号对用户数据的全网域访问权限 - 这就称为全网域授权。获得此授权的服务帐号可以模拟任何用户,包括有权访问 Cloud Search 的用户。

创建服务帐号和凭据

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

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

要访问 G Suite 网域的用户数据,您创建的服务帐号必须首先获得授权。为此,必须由具有管理控制台访问权限的用户执行以下任务:

  1. 转到您网域的管理控制台
  2. 从控件列表中选择安全。如果没有看到安全控件,请从页面底部的灰色栏中选择更多控件,然后从控件列表中选择安全
  3. 从选项列表中选择高级设置
  4. 身份验证部分中选择管理 API 客户端访问权限
  5. 客户端名称字段中,输入在前述服务帐号创建步骤中获得的客户端 ID。
  6. 一个或多个 API 作用域字段中,输入您的应用所需的作用域。对于使用 Query API 的搜索应用,请使用 https://www.googleapis.com/auth/cloud_search.query 这一作用域。
  7. 点击授权按钮。

这样,您的服务帐号即可获得对 Cloud Search Query API 的全网域访问权限,并且可以在该作用域内模拟您的网域的任意用户。您已准备好代表您网域的用户实例化授权的 Cloud Search API 服务对象。

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

本部分显示如何实例化 Cloud Search API 服务对象,然后授权它使用 OAuth 2.0 和您的服务帐号的凭据执行 API 请求,以执行 G Suite 网域范围的委派。这些示例从 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)